获取定位授权和注意事项

原创 2016年08月30日 13:36:56

获取定位授权和注意事项

iOS原生类获取定位授权是通过CoreLocation框架中的CLLocationManager类完成的,这其中可以解决两大类场景的授权问题:
1、原生开发的授权
2、网页混合开发的授权。使用webview加载网页,授权归入APP授权;在浏览器中加载页面,授权归入浏览器授权。

一、概述获取权限过程
1、调用authorizationStatus,获取状态,只要不是允许状态,进行下个步骤
2、CLLocationManager创建实例,并设置代理
3、保持CLLocationManager实例的生命周期到任务结束
4、如果授权状态不是允许,则获取授权或者跳转设置页面继续修改
5、根据需要开启不同的定位服务

二、获取授权状态

//次方法返回值为CLAuthorizationStatus的枚举类型,如下所示
[CLLocationManager authorizationStatus];

typedef NS_ENUM(int, CLAuthorizationStatus) {
    //未做选择:未选允许、拒绝(例如弹出提示框,用户之间退出APP时会发生)
    kCLAuthorizationStatusNotDetermined = 0,

    //受限制:未授权,主动现在定位服务,用户无法改变该状态(可能没有否认个人授权)
    kCLAuthorizationStatusRestricted,

    // 拒绝:用户拒绝授权,可在设置在修改
    kCLAuthorizationStatusDenied,

    //授权且在未使用APP时使用定位
    kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(NA, 8_0),

    // 授权且当APP使用中使用定位
    kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0),

    // 已废弃:不做解释,在官方demo中也不在关注该值
    kCLAuthorizationStatusAuthorized NS_ENUM_DEPRECATED(10_6, NA, 2_0, 8_0, "Use kCLAuthorizationStatusAuthorizedAlways") __TVOS_PROHIBITED __WATCHOS_PROHIBITED = kCLAuthorizationStatusAuthorizedAlways
};

根据当前授权状态做响应的交互处理:

#pragma mark - 检查授权状态
- (void)checkLocationServicesAuthorizationStatus {

    [self reportLocationServicesAuthorizationStatus:[CLLocationManager authorizationStatus]];
}


- (void)reportLocationServicesAuthorizationStatus:(CLAuthorizationStatus)status
{
    if(status == kCLAuthorizationStatusNotDetermined)
    {
        //未决定,继续请求授权
        [self requestLocationServicesAuthorization];

    }
    else if(status == kCLAuthorizationStatusRestricted)
    {
        //受限制,尝试提示然后进入设置页面进行处理(根据API说明一般不会返回该值)
        [self alertViewWithMessage];

    }
    else if(status == kCLAuthorizationStatusDenied)
    {
        //拒绝使用,提示是否进入设置页面进行修改
        [self alertViewWithMessage];

    }
    else if(status == kCLAuthorizationStatusAuthorizedWhenInUse)
    {
        //授权使用,不做处理

    }
    else if(status == kCLAuthorizationStatusAuthorizedAlways)
    {
       //始终使用,不做处理
    }

}

#pragma mark - Helper methods


- (void)alertViewWithMessage {
    UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"定位服务未开启" message:@"请在系统设置中开启服务" delegate:self cancelButtonTitle:@"暂不" otherButtonTitles:@"去设置", nil];
    [alter show];

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0)
    {

    }
    else
    {
        //进入系统设置页面,APP本身的权限管理页面
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    }
}

三、获取授权

#pragma mark - 获取授权

- (void)requestLocationServicesAuthorization
{
    //CLLocationManager的实例对象一定要保持生命周期的存活
    if (!self.locationManager) {
        self.locationManager  = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
    }

    [self.locationManager requestWhenInUseAuthorization];
    [self.locationManager startUpdatingLocation];
}
#pragma mark - CLLocationMangerDelegate methods

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{

    [self.locationManager stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{

    [self.locationManager stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    [self reportLocationServicesAuthorizationStatus:status];
}

关于以上代码几点说明
1、CLLocationManager的对象实例一定要保证生命周期存在知道任务结束,因为定位服务的任务执行时异步,使用局部变量不能保证定位服务正常进行。
2、iOS8系统之后一定要在info.plist文件中添加NSLocationWhenInUseUsageDescription或者NSLocationAlwaysUsageDescription,根据需要选择其一或者其二(决定了授权设置页面中选项数目),内容选填。
3、requestWhenInUseAuthorization或者requestAlwaysAuthorization方法,要在使用定位服务(比如startUpdatingLocation)之前调用。
4、APP进入后台运行的时候,开启定位服务会失败。
5、当进行授权选择后,会调用didChangeAuthorizationStatus方法,此时重新走一次检测授权状态过程。

四、调用方法开始整个获取权限流程

- (void)viewDidLoad {
    [super viewDidLoad];

    [self checkLocationServicesAuthorizationStatus];

}

只需要调用次方法即可。

五、最后的话
定位服务还有其他内容,学习了其他内容会继续更新,详情请参考官方文档,关于其他系统服务权限的获取,可以参考另一篇文章官方Demo

版权声明:如果你觉得文章有用,请留言告诉我。

授权定位

授权定位 授权定位API功能简介 授权定位API是haoservice数据服务平台面向政企市场推出的位置服务API,通过与三大基础电信运营商的合作,整合运营商定位能力,为广大政企客户提供一站式人员...
  • fuangji
  • fuangji
  • 2014年12月03日 17:53
  • 312

接入百度地图授权状态

参考链接: http://www.jianshu.com/p/f58be9373b6a if ([CLLocationManager locationServicesEnabled]  /...
  • lvchaman
  • lvchaman
  • 2017年05月20日 11:59
  • 363

iOS系统定位权限弹出框和跳转系统设置页面

转载▼ 最近大家提出了在微信等其他第三方的App 中进行定位时,如果没有定位权限,弹出的Alert点击后,可以跳转到系统的定位设置页面的现象,根据调研后可以得到以下结论: 1,该A...
  • zhangjiadashao1
  • zhangjiadashao1
  • 2015年01月12日 14:14
  • 1251

iOS Swift 判断应用定位权限

最近做到地图定位的东西,在搜索应用定位权限判断的这一块儿的时候搜到了许多答案,现在把自己的一些理解说一下,有错误请大家指正。 iOS的应用定位权限有种状态  1   .NotDetermined 表示...
  • crypond
  • crypond
  • 2016年01月26日 17:31
  • 2482

ios8.0下CLLocationManager定位服务需要授权了

http://blog.csdn.net/pinklpig/article/details/7191347 http://blog.csdn.net/pinklpig/article/detai...
  • jeffasd
  • jeffasd
  • 2015年11月10日 10:45
  • 1658

微信获取用户地理位置信息-微信jsapi接口

微信获取用户地理位置信息 微信jsapi
  • linfanhehe
  • linfanhehe
  • 2016年08月18日 14:43
  • 24402

iOS系统定位权限弹出框和跳转系统设置

1,该Alert为系统级别Alert,为系统控制弹出,弹出的触发条件为,在需要定位时,直接调用定位接口,系统判断当前定位总开关未开启,则会提示用户是否设置定位功能,用户点击后,跳转系统的定位设置页面,...
  • inszh
  • inszh
  • 2015年12月29日 16:06
  • 2188

iOS 后台定位审核被拒

如题,这是应用第二次关于后台定位。之前是一星期前,说开启了后台定位但是没有体现后台定位的功能,没有进行免责描述。 所以,我在iTunes的版本信息添加了哪里进行后台定位的描述,在plist里面写上了免...
  • lijunhao2011
  • lijunhao2011
  • 2016年07月07日 14:21
  • 807

Swift3.1 最新开启用户授权方法

用户授权的历史在iOS8之前,只要代码中有类似CLLocation这类涉及到涉及用户隐私、硬件、推送等的功能,系统会有自动弹窗询问用户是否开启授权。 从iOS8开始,苹果强制要求开发者主动申请授权,否...
  • qq_32217259
  • qq_32217259
  • 2017年07月23日 20:00
  • 320

微信中获取正确真实定位

1.获取配置参数,微信定位获取的GPS经纬度定位转换成百度定位,注意在正式服务器加载,微信中打开链接可测试获取$signPackage的方法 :点击打开链接 Title ...
  • xxq929604980
  • xxq929604980
  • 2016年11月14日 11:22
  • 2209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:获取定位授权和注意事项
举报原因:
原因补充:

(最多只允许输入30个字)