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

在进行地图定位搜索时,遇到iOS8设备上设置隐私->定位权限时应用闪退的问题。解决方案包括:在plist文件中添加NSLocationAlwaysUsageDescription和NSLocationWhenInUseUsageDescription,确保其类型为NSString;针对iOS8及以上系统,手动调用locationManager.requestAlwaysAuthorization请求权限,并在info.plist中设置NSLocationAlwaysUsageDescription以显示授权提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值