在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
答案 0 :(得分:3)
有点混乱,不是吗?当您询问“始终”并且用户点按“一次允许”时,系统会告知您获得了WhenInUse。但这实际上并不重要。您总是有 provisional 。所以:
随后您进入后台并开始监视访问或区域或任何位置监视用途时,出于使用目的,这将转换为“始终授权”。 (您的日志记录应该确认这一点。)
然后,由于您只有一次授权,因此当您回到前台时,将不会再被确定。
因此,主要的是,笑到邪恶的笑声然后继续前进。您的后台位置监视将起作用,这很重要。它不仅有效,而且还可以向用户再次显示授权警报 ,这是iOS 13中所有这些更改的原因,不用担心,请开心。 / p>