IOS-定位地图

来源:互联网 发布:Ubuntu 软件怎么打不开 编辑:程序博客网 时间:2024/05/01 08:59


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

0 0
原创粉丝点击