摘要:前段时间在做地图定位搜索的时候,遇到定位失败和不能通过系统设置-->隐私-->定位来设置定位权限的问题,具体情况:点击设置中的“隐私”-->定位-->点击自己程序,iOS7反应正常,iOS8则直接崩溃的问题,下面总结一下,供大家遇到该类问题参考。
1.iOS8点击设置-->隐私-->定位-->对应程序,设置界面闪退问题解决
(1)plist文件新加两条变量:
a、NSLocationAlwaysUsageDescription=YES;
b、NSLocationWhenInUseUsageDescription=YES
通常情况,plist文件中有这两个字段,但是可能的是BOOL类型,如果是则改成NSString类型。
正常情况:
导致闪退的情况:
(2)判断手机是否为iOS8系统,请求权限
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
if(IOS8){
// [locationManager requestAlwaysAuthorization];//始终
[locationManager requestWhenInUseAuthorization];//使用期间
}
[locationManager startUpdatingLocation];
(3)增加代理方法
– (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
[locationManager requestWhenInUseAuthorization];
}
break;
default:
break;
}
}
2.iOS定位无效问题
iOS8之前做的app,之前正常使用,升级到iOS8之后,定位不能正常工作,程序也不报错。具体情况:重装英语再调用定位服务时会弹出授权对话框,但是iOS8却没有弹出授权窗口。
问题解决方法:调用locationManager requestAlwaysAuthorization手动申请授权,然后你可以在didChangeAuthorizationStatus这个回调里面监测是否可以具有定位权限。但是有几点要注意当你调用这个request的时候,它弹出的对话框里面的那句询问语,需要我们自己指定。所以需要在info.plist里面添加一个key: NSLocationAlwaysUsageDescription,value就是对话框上想要询问的语句。这时候程序才能正确的弹出授权对话框,用户选了同意以后,定位代码就正确的运行。
_instance.locationManager = [[CLLocationManager alloc] init];//创建位置管理器
_instance.locationManager.delegate=_instance;
_instance.locationManager.desiredAccuracy=kCLLocationAccuracyBest;
_instance.locationManager.distanceFilter=100.0f;
_instance.updating=NO;
//定位服务是否可用
BOOL enable=[CLLocationManager locationServicesEnabled];
//是否具有定位权限
int status=[CLLocationManager authorizationStatus];
if(!enable || status<3){
//请求权限
[_instance.locationManager requestWhenInUseAuthorization];
}
authorizationStatus的枚举:
<span style="font-size:14px;">typedef NS_ENUM(int, CLAuthorizationStatus) {
// 用户从未选择过权限
kCLAuthorizationStatusNotDetermined = 0,
// 无法使用定位服务,该状态用户无法改变
kCLAuthorizationStatusRestricted,
// 用户拒绝该应用使用定位服务,或是定位服务总开关处于关闭状态
kCLAuthorizationStatusDenied,
// 这个值已弃用
kCLAuthorizationStatusAuthorized // 大致是用户允许该程序无论何时都可以使用地理信息
kCLAuthorizationStatusAuthorizedAlways // 大致是用户同意程序在可见时使用地理位置
kCLAuthorizationStatusAuthorizedWhenInUse
};</span>
总结一下这个问题就是在以前的IOS版本中当开始使用定位服务时会自动弹出询问授权的对话框,而现在IOS8需要手动调用locationManager requestAlwaysAuthorization手动申请授权,来获取定位权限。
3. iOS开发系列--地图与定位
如何使用地图和定位,现在转载一篇文章,参考一下。转载自:http://www.cnblogs.com/kenshincui/p/4125570.html