iOS 13 仅在用户“允许一次”后再次调用 requestAlwaysAuthorization

Dav*_*dze 0 core-location ios ios-permissions ios13

在 iOS13 上请求“始终”权限期间,用户可以点击“允许一次”,这将调用具有状态的适当委托kCLAuthorizationStatusAuthorizedWhenInUse,但再次请求“始终”会调用带有 的委托kCLAuthorizationStatusAuthorizedAlways为什么?当其他组合像您总是请求的那样只工作一次时,您会得到它,甚至再次调用也不会调用带有状态的委托。

要测试的示例代码:

@import CoreLocation;

@interface ViewController () <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *locationManager;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
}
- (IBAction)doauthloc:(id)sender {
    [self.locationManager requestAlwaysAuthorization];
}

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    switch(status) {
        case kCLAuthorizationStatusNotDetermined:NSLog(@"AUTH STATUS:kCLAuthorizationStatusNotDetermined"); break;
        case kCLAuthorizationStatusRestricted:NSLog(@"AUTH STATUS:kCLAuthorizationStatusRestricted"); break;
        case kCLAuthorizationStatusDenied:NSLog(@"AUTH STATUS:kCLAuthorizationStatusDenied"); break;
        case kCLAuthorizationStatusAuthorizedAlways:NSLog(@"AUTH STATUS:kCLAuthorizationStatusAuthorizedAlways"); break;
        case kCLAuthorizationStatusAuthorizedWhenInUse:NSLog(@"AUTH STATUS:kCLAuthorizationStatusAuthorizedWhenInUse"); break;
    };
}

@end
Run Code Online (Sandbox Code Playgroud)

mat*_*att 5

这有点令人困惑,不是吗?当您要求“始终”并且用户点击“允许一次”时,系统会告诉您您有“WhenInUse”。但这实际上并不重要。你有临时的永远。所以:

  • 当您随后进入后台并开始监控访问或区域或任何位置监控使用情况时,这将转换为始终授权以供使用。(您的日志记录应该证实了这一点。)

  • 然后,因为您只获得了一次授权,所以当您回到前台时,您将再次处于“未确定”状态。

所以要点是,笑一笑然后继续前进。您的后台位置监控将起作用,这才是最重要的。它不仅有效,而且作为奖励,您可以再次向用户显示授权警报,这就是 iOS 13 中所有这些变化的原因。别担心,高兴吧。