【问题标题】:Xcode warning when using MapKit and CoreLocation使用 MapKit 和 CoreLocation 时的 Xcode 警告
【发布时间】:2015-08-10 07:06:17
【问题描述】:

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

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

当我第一次运行该应用程序时,该应用程序会适当地询问它是否可以访问我的位置。单击“允许”后,我会从 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];
}

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

【问题讨论】:

    标签: ios objective-c cocoa-touch mkmapview core-location


    【解决方案1】:

    你打电话给requestWhenInUseAuthorization,这是真的。但是您是否要等到获得授权?不,你不是。您(作为用户)正在点按“允许”,但为时已晚:您的代码已经继续,继续告诉地图视图开始跟踪用户的位置。

    只需查看requestWhenInUseAuthorization 上的文档:

    当当前授权状态为kCLAuthorizationStatusNotDetermined时,该方法异步运行

    明白了吗? 异步运行。这意味着请求权限发生在另一个线程的后台。

    文档接着说:

    状态确定后,位置管理器将结果传递给delegate的locationManager:didChangeAuthorizationStatus:方法

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

    另外,你错过了一个重要的步骤:你没有检查实际状态是什么。只有在状态未确定时,您才应该请求授权。如果状态被限制或拒绝,则根本不能使用位置管理器;如果状态被授予,那么再次请求授权是没有意义的。

    所以,总结一下,你的逻辑流程图应该是:

    • 检查状态。

    • 状态是 Restricted 还是 Denied?停止。您不能使用获取位置更新或在地图上进行定位。

    • 状态是否已授予?继续获取位置更新或在地图上确定位置。

    • 状态是否未确定?请求授权并停止。将locationManager:didChangeAuthorizationStatus: 视为您的授权请求的完成处理程序。那时,回到流程图的开头!

    【讨论】:

    • 添加了更多信息。这里的逻辑相当复杂。
    • 添加了更多信息,详细说明了如何正确执行此操作的逻辑流程图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    相关资源
    最近更新 更多