手动调用CLLocationManager对象的requestAlwaysAuthorization方法,会弹出定位授权提示弹框。调用该方法需要在Info.plist中设置NSLocationAlwaysUsageDescription的值,这个值会显示在系统提示框中。
- 仅执行 requestWhenInUseAuthorization,弹框中提示信息:允许”XXX”在您使用该应用时访问您的位置吗?,并且只有允许或不允许选择项。执行requestAlwaysAuthorization或同时requestWhenInUseAuthorization 弹框中提示信息:允许”XXX”访问您的位置?,并且这时会有三个选择项:仅在使用应用期间,始终允许,不允许。
注意:CLLocationManager的实例需要设置为全局变量,否则定位授权提示弹框会出现一闪而过的问题。
1
2
3
4
5
6
7
8
9
10
11if ([CLLocationManager locationServicesEnabled]) {
// 创建位置管理者对象
self.lcManager = [[CLLocationManager alloc] init];
self.lcManager.delegate = self; // 设置代理
// 设置定位距离过滤参数 (当本次定位和上次定位之间的距离大于或等于这个值时,调用代理方法)
self.lcManager.distanceFilter = 100;
self.lcManager.desiredAccuracy = kCLLocationAccuracyBest; // 设置定位精度(精度越高越耗电)
[self.lcManager requestAlwaysAuthorization];
[self.lcManager requestWhenInUseAuthorization];
[self.lcManager startUpdatingLocation]; // 开始更新位置
}代理方法监听状态变化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
{
NSLog(@"用户还未决定授权");
break;
}
case kCLAuthorizationStatusRestricted:
{
NSLog(@"访问受限");
break;
}
case kCLAuthorizationStatusDenied:
{
// 类方法,判断是否开启定位服务
if ([CLLocationManager locationServicesEnabled]) {
NSLog(@"定位服务开启,被拒绝");
} else {
NSLog(@"定位服务关闭,不可用");
}
break;
}
case kCLAuthorizationStatusAuthorizedAlways:
{
NSLog(@"获得前后台授权");
break;
}
case kCLAuthorizationStatusAuthorizedWhenInUse:
{
NSLog(@"获得前台授权");
break;
}
default:
break;
}
}