【iOS】地图定位无效及点击设置隐私定位直接闪退问题

来源:互联网 发布:上古卷轴美女捏脸数据 编辑:程序博客网 时间:2024/05/17 05:07


摘要前段时间在做地图定位搜索的时候,遇到定位失败和不能通过系统设置-->隐私-->定位来设置定位权限的问题,具体情况:点击设置中的“隐私”-->定位-->点击自己程序,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

0 0
原创粉丝点击