gpt4 book ai didi

ios - 使用 MapKit 和 CoreLocation 时的 Xcode 警告

转载 作者:行者123 更新时间:2023-12-01 17:51:05 25 4
gpt4 key购买 nike

我正在尝试使用实现 MKMapView 的实例, 使用 CoreLocation跟踪用户的位置,然后放大到他们所在的位置。

当我在前台时,我只想跟踪用户的位置。由于我的应用程序是针对 iOS8 的,所以我有一个 plist 条目用于键 NSLocationWhenInUseUsageDescription .

当我第一次运行该应用程序时,该应用程序会适本地询问它是否可以访问我的位置。单击“允许”后,我会收到来自 Xcode 的以下警告:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
...这有点令人困惑,因为我实际上是在调用 requestWhenInUseAuthorization ,如下面的代码所示:

@property (strong, nonatomic) IBOutlet MKMapView *mapView;
@property(nonatomic, retain) CLLocationManager *locationManager;

@end

@implementation MapView

- (void)viewDidLoad {
[super viewDidLoad];
[self locationManager];
[self updateLocation];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
self.locationManager = nil;
}

- (CLLocationManager *)locationManager {
//We only want to get the location when the app is in the foreground
[_locationManager requestWhenInUseAuthorization];
if (!_locationManager) {
_locationManager = [[CLLocationManager alloc] init];
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}
return _locationManager;
}

- (void)updateLocation {
_mapView.userTrackingMode = YES;
[self.locationManager startUpdatingLocation];
}

有没有人知道为什么会出现这个警告?

最佳答案

您调用requestWhenInUseAuthorization , 那是真实的。但是你是等到获得授权吗?不,你不是。您(作为用户)正在点击允许,但发生得太晚了:您的代码已经继续,直接告诉 map View 开始跟踪用户的位置。

只需查看 requestWhenInUseAuthorization 上的文档即可:

When the current authorization status is kCLAuthorizationStatusNotDetermined, this method runs asynchronously



懂吗?异步运行。这意味着请求许可发生在另一个线程的后台。

文档继续说:

After the status is determined, the location manager delivers the results to the delegate’s locationManager:didChangeAuthorizationStatus: method



所以,实现那个方法。如果您刚刚获得许可,那就是您可以开始使用位置管理器的信号。

此外,您还遗漏了一个重要步骤:您没有检查实际状态。如果状态未确定,您应该只请求授权。如果状态被限制或拒绝,则根本不能使用位置管理器;如果状态被授予,则没有必要再次请求授权。

所以,总结一下,你的逻辑流程图应该是:
  • 检查状态。
  • 状态是 Restricted 还是 Denied?停止。您不能使用获取位置更新或在 map 上进行定位。
  • 状态是否已授予?继续获取位置更新或在 map 上进行定位。
  • 状态未定?请求授权并停止。对待 locationManager:didChangeAuthorizationStatus:作为您的授权请求的完成处理程序。那时,回到流程图的开头!
  • 关于ios - 使用 MapKit 和 CoreLocation 时的 Xcode 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30495288/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com