2014年07月8日

iOS8地理位置编程的奇葩改进

作者 非鱼

一个很简单的iBeacon的测试程序,以前都好用的,手机升级到iOS8 b2,xcode6 b2编译运行,就不能正常工作了,总是提示位置授权状态是kCLAuthorizationStatusNotDetermined,进到设置里隐私-地理位置下面找到这个应用,设为总是允许,再重新编译运行,它又会变成这个未知状态。看了文档加上搜索了很多次,都是说当弹出授权对话框的时候如果用户没有选同意,就会出现这个状态。可是,我这应用根本就不会弹出让用户授权的对话框啊。

以为是xcode的Bug,今天等到了beta3,结果还是同样的情况。又重新开始搜索,这次终于找到了眉目。

首先,原来的代码只要走到locationManager startMonitoringForRegion的时候就会自动弹出询问授权的对话框,而现在你需要调用locationManager requestAlwaysAuthorization手动申请授权,并在didChangeAuthorizationStatus这个回调里面继续后面的开始监测的代码。

其次,最坑爹的是,当你调用这个request的时候,它弹出的对话框里面的那句询问语,需要你自己指定。所以需要在你的info.plist里面添加一个key: NSLocationAlwaysUsageDescription,value就是对话框上那句询问语。这时候程序才能正确的弹出授权对话框,用户选了同意以后,程序后面的代码才能够正确的运行。