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

Posted

技术标签:

【中文标题】iOS 13 仅在用户“允许一次”后再次调用 requestAlwaysAuthorization【英文标题】:iOS 13 call requestAlwaysAuthorization again after user "Allow Once" only 【发布时间】:2019-10-18 15:06:14 【问题描述】:

ios13 上请求 Always 权限期间,用户可以点击“Allow Once”,这将调用状态为kCLAuthorizationStatusAuthorizedWhenInUse 的适当代理,但再次请求“Always”以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

【问题讨论】:

【参考方案1】:

这有点令人困惑,不是吗?当您要求 Always 并且用户点击 Allow Once 时,您会被告知您获得了 WhenInUse。但这实际上并不重要。你总是临时。所以:

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

然后,因为你只有一次授权,当你回到前台时,你将再次未确定。

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

【讨论】:

就我个人而言,我认为在 iOS 13 中如何向用户发出警报以进行位置授权的这一修订非常棒。它最大限度地提高了您进行定位服务的机会,而不会让用户感到惊讶或烦恼。 (唯一不好的是,如果用户在您请求“始终”时点击了“使用时”,则当您回到前面时,“始终”确认对话框的措辞;这是不合语法且难以理解的。) 另外我应该注意,你正在做的不是你应该做的。您应该在最初询问 WhenInUse 以显示对话框,然后在您进入后台并开始使用 Always 电源时询问 Always。

以上是关于iOS 13 仅在用户“允许一次”后再次调用 requestAlwaysAuthorization的主要内容,如果未能解决你的问题,请参考以下文章

Branch.io 仅在用户登录后重定向

仅在客户端 JS 中检查数据后才调用 Ajax?

Crashlytics 线程仅在使用 Xcode 11 构建的 iOS 13 上崩溃

iOS Beacon Monitoring - didEnterRegion 仅在受监控区域触发 didExitRegion 后调用

提升::ASIO。确保仅在调用 async_receive(...) 后调用 io_service.run() ?

返回函数调用与仅在递归期间再次调用函数有啥区别?