美文网首页iOS地图
iOS8.0的CoreLocation定位

iOS8.0的CoreLocation定位

作者: iOS_成才录 | 来源:发表于2015-11-12 19:31 被阅读174次

    一、简介

    • iOS6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权
      • 要想获得用户的位置
    • 想访问用户的通讯录、日历、相机、相册等等
    • 当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权
    ios8.0-.png
    • 一旦用户选择了“Don’tAllow”,意味着你的应用以后就无法使用定位功能 -> 定位开启,被拒绝
    • ios8-:需要截图提醒用户并引导用户开启

    • 开发者可以在Info.plist文件中配置:说明定位的目的

      • 配置:


        配置定位目的.png
      • 效果图:


        配置后弹出用户授权对话框.png

    二、标准定位服务 与 监听重大位置的改变(基于基站)

    1、 标准定位服务(基于gps/wifi/基站)

    • 标准定位服务(基于gps/基站/wifi定位, 具体使用哪种,苹果有自己规则)

    • 特点:程序关闭,就没法获取位置

    • 开始定位方法:

    [self.locationM startUpdatingLocation];
    

    2、 监听重大位置的改变(基于基站进行定位)

    • 要求, 设备必须有电话模块

    • 特点:

      • 当app被完全关闭时,也可以接收到位置通知,并让app进入后台处理
      • 定位精度相比于上面,定位精度不大,所以耗电小,而且定位更新频率依据基站密度而定
    • 开始定位方法:

    [self.locationM startMonitoringSignificantLocationChanges];
    ```

    应用场景

    • 1> 如果要求定位及时,精度较高,并且运行时间较短,可使用标准定位;
    • 2> 如果长时间监控用户位置,用户移动速度比较快(例如打车软件),可使用后者

    三、iOS8.0- 的定位实现

    1、前台定位

    • 1.导入CoreLocation框架和对应的主头文件

    import <CoreLocation/CoreLocation.h>

        ``` 
    
    • 2.创建CLLcationManager对象,并设置代理
             _locationM = [[CLLocationManager alloc] init];
            _locationM.delegate = self;
           ```
      
    • 3.调用CLLcationManager对象的startUpdatingLocation方法进行更新用户位置
         [_locationM startUpdatingLocation];
          ```
      
    • 4.实现代理方法,接收位置参数

    -(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations
    ```

    基本使用

    #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;
        }
        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];
        
    }
    @end
    

    2、后台定位

    • 1.在前台定位基础上,勾选后台模式:update locations(如下图)
    勾选后台模式.png

    相关文章

      网友评论

        本文标题:iOS8.0的CoreLocation定位

        本文链接:https://www.haomeiwen.com/subject/muehhttx.html