zoukankan      html  css  js  c++  java
  • IOS8定位无效问题

    我的一个程序,以前都好用的,包括ios6,ios7,但是手机升级到iOS8后,xcode6编译运行,就不能正常工作了,也不报错。现象是进到设置里隐私-定位服务 下面找到这个应用,设为总是允许,就可以正常获取地理信息,但是再重新编译运行,它又会变成这个未知状态。

    琢磨后想起来以前重装应用再调用定位服务时会弹出授权对话框,但是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的枚举吧

    typedef NS_ENUM(int, CLAuthorizationStatus) {
      // 用户从未选择过权限
      kCLAuthorizationStatusNotDetermined = 0,
      // 无法使用定位服务,该状态用户无法改变
      kCLAuthorizationStatusRestricted,
      // 用户拒绝该应用使用定位服务,或是定位服务总开关处于关闭状态
      kCLAuthorizationStatusDenied,
      // 这个值已弃用
      kCLAuthorizationStatusAuthorized // 大致是用户允许该程序无论何时都可以使用地理信息
      kCLAuthorizationStatusAuthorizedAlways // 大致是用户同意程序在可见时使用地理位置
      kCLAuthorizationStatusAuthorizedWhenInUse 
    };

    也就是[CLLocationManager authorizationStatus]返回大于等于3时才是可以使用定位服务的。

    总结一下这个问题就是在以前的IOS版本中当开始使用定位服务时会自动弹出询问授权的对话框,而现在IOS8需要手动调用locationManager requestAlwaysAuthorization手动申请授权,来获取定位权限。

  • 相关阅读:
    小小的疑问和小小的想法
    为什么你的代码不能给别人看?
    linux之中对文件名和文件进行编码转换
    数据泵导入导出步骤
    杭电acm1266
    杭电acm2097
    杭电acm2019
    杭电acm1395(转自牛人代码)
    杭电acm1279
    杭电acm1412
  • 原文地址:https://www.cnblogs.com/zhaoguowen/p/4226180.html
Copyright © 2011-2022 走看看