8

我正在编写一个需要使用 CoreLocation 服务的 Mac 应用程序。只要我在安全首选项窗格中手动验证服务,代码和位置就可以正常工作。但是,该框架不会自动弹出权限对话框。该文档指出:

重要 用户可以选择拒绝应用程序访问定位服务数据。在应用程序的初始使用期间,Core Location 框架会提示用户确认使用位置服务是可以接受的。如果用户拒绝该请求,则 CLLocationManager 对象在以后的请求中向其委托报告一个适当的错误。

我的委托确实收到了一个错误,并且 +locationServicesEnabled 的值在 CLLocationManager 上是正确的。唯一缺少的部分是向用户提示有关权限的提示。这发生在我的开发 MPB 和一个朋友的 MBP 上。我们俩都搞不清出了什么问题。

有没有人遇到过这个?

相关代码:

_locationManager = [CLLocationManager new];    
[_locationManager setDelegate:self];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyKilometer];
...
[_locationManager startUpdatingLocation];
4

1 回答 1

4

我发现在 Mac 上,当您通过调用启动定位服务时

[locationManager startUpdatingLocation];

它触发

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

状态为

kCLAuthorizationStatusNotDetermined

如果您注意此状态,然后再次开始更新位置,则会触发权限对话框:例如

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
        case kCLAuthorizationStatusAuthorized:
            NSLog(@"Location Services are now Authorised");
            [_locationManager startUpdatingLocation];

            break;

        case kCLAuthorizationStatusDenied:
            NSLog(@"Location Services are now Denied");
            break;

        case kCLAuthorizationStatusNotDetermined:
            NSLog(@"Location Services are now Not Determined");

            //  We need to triger the OS to ask the user for permission.
            [_locationManager startUpdatingLocation];
            [_locationManager stopUpdatingLocation];

            break;

        case kCLAuthorizationStatusRestricted:
            NSLog(@"Location Services are now Restricted");
            break;

        default:
            break;
    }
}
于 2014-04-26T10:38:27.167 回答