IOS-定位地图
2016-09-18 11:10
295 查看
NSLocationAlwaysUsageDescription: 允许在前后台获取GPS的描述 NSLocationWhenInUseDescription : 允许在前台获取GPS的描述
1、前台定位
1.导入CoreLocation框架和对应的主头文件#import <CoreLocation/CoreLocation.h>
2.创建CLLcationManager对象,并设置代理请求前台定位授权,并配置KEY
配置KEY .png
3.调用CLLcationManager对象的startUpdatingLocation方法进行更新用户位置
[_locationM startUpdatingLocation];
4.实现代理方法,接收位置参数
-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations
2、后台定位
方案一:在APP处于前台定位授权场景下,
勾选后台运行模式update locations
注意:如果APP处于后台,则会出现
蓝条
方案二:请求
前后台定位授权,并配置KEY
不会出现蓝条
[_locationM requestAlwaysAuthorization];
配置KEY.png
三、基本实现
Info.plist文件中配置,进行前台/前后台定位,定位目的的配置定位目的的配置.png
#import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewController ()<CLLocationManagerDelegate> /** 位置管理者 */ @property (nonatomic, strong) CLLocationManager *locationM; @end @implementation ViewController #pragma mark -懒加载 -(CLLocationManager *)locationM { if (!_locationM) { //1 创建位置管理者 _locationM = [[CLLocationManager alloc] init]; // 1.1 告诉外界位置的方案: 代理, block 通知 _locationM.delegate = self; // 设置每隔多远定位一次(1次 111km/100m) // 最新的位置距离上一次位置之间的距离大于100m, 才会通过代理告诉外界 // _locationM.distanceFilter = 100; // kCLLocationAccuracyBestForNavigation // 最适合导航 // kCLLocationAccuracyBest; // 最好的 // kCLLocationAccuracyNearestTenMeters; // 附近10米 // kCLLocationAccuracyHundredMeters; // 100米 // kCLLocationAccuracyKilometer; // 1000米 // kCLLocationAccuracyThreeKilometers; // 3000米 // 定位精确度 // 定位精确度越高, 越耗电, 而且, 定位时间越长 _locationM.desiredAccuracy = kCLLocationAccuracyBest; //**-------ios8.0+定位适配---------- */ if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // 请求前台定位授权 // 默认情况下, 只能在前台获取用户位置 // 如果想要获取后台位置, 需要勾选后台模式 location updates , 但是会出现蓝条 // [_locationM requestWhenInUseAuthorization]; // 请求前后台定位授权 // 默认在前后台都可以获取用户位置信息, 无论是否勾选后台模式locaiton updates, 而且不会出现蓝条 // 如果当前的授权状态!=用户为选择状态, 那么这个方法不会有效 [_locationM requestAlwaysAuthorization]; } // 其它适配方案 // if([_locationM respondsToSelector:@selector(requestAlwaysAuthorization)]) // { // [_locationM requestAlwaysAuthorization]; // } } return _locationM; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 2. 使用位置管理者, 开始获取用户位置 // 开发经验: start 开始某个服务 stop 停止某个服务 // 一旦调用了这个方法, 那么就会不断的获取用户位置信息, 然后告诉外界 // 默认情况,只能在前台获取用户位置信息, 如果我们想要在后台获取位置, 必须勾选后台模式 location updates // 标准定位服务(基于gps/wifi/基站) [self.locationM startUpdatingLocation]; // 监听重大位置的改变(基于基站进行定位 , 要求, 设备必须有电话模块) // [self.locationM startMonitoringSignificantLocationChanges]; } #pragma mark -CLLocationManagerDelegate // 当获取到用户位置信息时调用 // manager : 位置管理者 // locations: 位置数组 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { NSLog(@"定位到了"); // 一般我们开发中, 获取到用户位置信息之后, 做一些业务逻辑操作 // 针对于定位一次的情况, 可以在定位到之后 停止获取用户位置 // [manager stopUpdatingLocation]; } // 如果授权状态发生变化时,调用 // status : 当前的授权状态 -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { switch (status) { case kCLAuthorizationStatusNotDetermined: { NSLog(@"用户未决定"); break; } case kCLAuthorizationStatusRestricted: { NSLog(@"受限制"); break; } case kCLAuthorizationStatusDenied: { // 判断当前设备是否支持定位, 并且定位服务是否开启() if([CLLocationManager locationServicesEnabled]) { NSLog(@"定位开启,被拒绝"); // ios8,0- 需要截图提醒引导用户 // iOS8.0+ NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; } }else { NSLog(@"定位服务关闭"); } break; } case kCLAuthorizationStatusAuthorizedAlways: { NSLog(@"前后台定位授权"); break; } case kCLAuthorizationStatusAuthorizedWhenInUse: { NSLog(@"前台定位授权"); break; } default: break; } } @end
相关文章推荐
- iOS 10 的各种适配问题
- iOS:这些你应该知道的国内大牛
- iOS10 XCode8 证书问题Signing解决方法
- iOS-重回block小白之路
- iOS -- 隐藏返回按钮
- iOS 隐藏/去掉 导航栏返回按钮中的文字
- iOS局部刷新
- iOS 金钱格式化
- 对iOS10新增Api的详细探究
- 玩转iOS开发:集成 Union Pay - 银联支付
- ios10新特性
- 兼容iOS 10 资料整理笔记
- ios10 出现的问题
- 兼容iOS 10 资料整理笔记
- iOS10新特性之相册闪退
- iOS10兼容,最新特性。
- iOS 开发中C函数调用OC方法
- iOS字符串处理笔记(正则表达式、NSScanner扫描、CoreParse解析器)
- iOS的runtime详细整理
- iOS隐藏导航条、tabbar 1px的底部横线