iOS-学习笔记(3)--定位

xiaoxiao2021-02-28  12

导入CoreLocation框架和对应的主头文件(这是废话)

#import <CoreLocation/CoreLocation.h>

创建位置管理者

- (CLLocationManager *)clManager { if (_clManager == nil) { _clManager = [[CLLocationManager alloc]init]; _clManager.delegate = self; //精确度 _clManager.desiredAccuracy = kCLLocationAccuracyBest; //前台定位授权 //默认情况下不可以在后台获取位置 [_clManager requestWhenInUseAuthorization]; } return _clManager; }

desiredAccuracy:定位精度,刚看到这个属性时,以为是个枚举值,结果是个double类型,有以下几种取值

kCLLocationAccuracyBestForNavigation : 最适合导航kCLLocationAccuracyBest : 精确度最高kCLLocationAccuracyNearestTenMeters : 10mkCLLocationAccuracyHundredMeters : 100mkCLLocationAccuracyKilometer : 1000mkCLLocationAccuracyThreeKilometers : 3000m

定位精度越高,定位所需时间越长,也越耗电。

requestWhenInUseAuthorization : 向用户请求前台定位授权

使用这个方法请求前台授权之前,还需要在info.plist文件中配置授权说明,key为NSLocationWhenInUseUsageDescription,value为描述你使用定位是用来干嘛的,所以写得好是能提高用户授权的概率的。

调用startUpdatingLocation方法来开始定位,更新用户位置信息

[_locationM startUpdatingLocation];

实现代理方法,处理接收到的位置数据

-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations { //开始处理位置信息 }

要让APP在后台可以定位,有两种方法来实现

如果APP已经获取到了前台定位授权,那可以在 Backgroud Modes 中勾选 Location updates 选项,不过当APP退至后台时,顶部会有个蓝条。

如果在iOS 9+ 中,同时还需要设置 allowsBackgroundLocationUpdates为 YES。

_locationM.allowsBackgroundLocationUpdates = YES;

还需要注意一点:如果allowsBackgroundLocationUpdates为 YES,但是 Backgroud Modes 中未勾选 Location updates,程序会出错。

第二个方法就是直接请求前后台定位授权。使用这种方法,当程序退至后台时,顶部也不会出现蓝条。

[_locationM requestAlwaysAuthorization];

同样的,也需要在info.plist 文件中配置授权说明。

iOS 9 出了个获取一次位置的方法。

[_clManager requestLocation];

这个方法会按照定位精确度从低到高进行排序,逐个进行定位。在定位超时后,即使获取到的位置不是精确度最高的那个也会停止定位,并通过代理告诉外界。 使用这个方法需要注意以下两点:

必须实现代理方法 -locationManager:didFailWithError:。不能和startUpdatingLocation方法同时使用。

监听APP的定位授权状态,实现以下代理方法即可

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { switch (status) { case kCLAuthorizationStatusNotDetermined: NSLog(@"用户还未决定"); break; case kCLAuthorizationStatusRestricted: NSLog(@"访问受限"); break; case kCLAuthorizationStatusDenied: NSLog(@"拒绝访问"); break; case kCLAuthorizationStatusAuthorizedWhenInUse: NSLog(@"前台定位授权"); break; case kCLAuthorizationStatusAuthorizedAlways: NSLog(@"前后台定位授权"); break; default: break; } }

如果APP在后台运行,用户在设置界面修改了定位权限,可以在这个方法里监听到。

转载请注明原文地址: https://www.6miu.com/read-1750255.html

最新回复(0)