美文网首页
iOS开发-地图及定位

iOS开发-地图及定位

作者: _我是不一样的烟火 | 来源:发表于2017-04-25 10:37 被阅读0次

    1. 简介

    • 地图是按一定的比例运用符号、颜色、文字注记等描绘显示地球表面的自然地理、行政区域、社会经济状况的图形,也就是显示用户的坐标

    • 应用到地图的生活场景和APP:

    1. 旅游:需要地图导航路线
    2. 找路:需要通过地名搜索到地图上的位置
    3. 外卖:需要告知商家你的地址才能送餐
    4. 社交:需要告知对方约会地点以方便下一步活动
    5. 地图类应用
    6. 运动类应用
    7. 线下P2P类:如订餐类、购物类等等
    8. 所有出现弹窗:是否允许获取用户弹窗的应用都用到了地图功能


      0201.png
    • 地图在实际开发中的应用场景:
      (1)获取一次当前用户的位置:如订餐类
      (2)持续不断的获取当前用户的位置:地图类,运动类
      (3)大头针功能
      (4)导航功能:地图类
      (5)地图画线功能:运动类,根据用户跑步画出跑步路线
      (6)第三方的集成:百度地图第三方
      (7)分享当前位置:分享功能

    2. 地图的一次定位

    • 如何使用定位功能
      在iOS中,如果想要使用导航功能获取用户当前的位置,则需要使用CoreLocation框架

    • 如何给工程导入框架


      0301.png
    • Xcode5之前, 使用其他的系统框架时, 必须要导入对应的框架才可以使用. Xcode5以后, 默认导入UIKit, Foundation, CoreGraphics三个框架. 从Xcode5开始, 很多自带的框架可以不用导入, 系统会帮我们自动导入对应框架. 但是有些框架在使用时必须导入框架, 譬如Sqlite(动态链接库)

    • 步骤

    1. 创建位置管理器
    2. 请求授权:配置plist文件/兼容iOS的判断
    3. 设置代理
    4. 开始更新用户位置: startUpdatingLocation方法
    5. 在位置管理器的didUpdateLocations代理方法中停止位置更新: stopUpdatingLocation
    • 如何使用CLLocation框架获取用户位置

    -(void)viewDidLoad {
    [super viewDidLoad];

        //创建CLLocationManager{位置管理器,作用:1.能够定位 2.请求用户授权}
        //1.创建
        self.locatitonManager = [[CLLocationManager  alloc] init];
        //2.请求用户授权,iOS8新增方法,如果不调用将不能定位
        if ([[UIDevice currentDevice].systemVersion floatValue] >=8.0) {
             //始终允许定位
           [self.locatitonManager requestAlwaysAuthorization];
            //使用期间允许定位
            //写完授权方法后 必须要配置infoplist文件 否则不会弹出授权弹窗
            [self.locatitonManager requestWhenInUseAuthorization];
        }
        //3.设置代理监听位置变化
        self.locatitonManager.delegate = self;
        //4.开始定位
        [self.locatitonManager startUpdatingLocation];
    
    
        //计算两个位置之间的距离
        CLLocation *location1 = [[CLLocation alloc] initWithLatitude:40.058 longitude:116.3];
        CLLocation *location2 = [[CLLocation alloc] initWithLatitude:22.058 longitude:113.3];
        //通过实例方法distanceFromLocation获取两个位置之间的直线距离,单位是米
        //实际开发中,两个客户端位置之间的距离由服务器返回(路线由服务器计算,非直线距离)
        double distance = [location1 distanceFromLocation:location2];
        NSLog(@"%lf",distance);
    
    }
    
    //此方法会频繁调用,会导致手机很耗电,如果只想调用一次,可以在该方法中停止定位
     -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
     {
        static int i;
        i+=1;
        NSLog(@"%d",i);
    
        //数组里面只有一个数量
        for (CLLocation *location in locations) {
            NSLog(@"%@",location);
        };
    
       //获取位置对象
        CLLocation *location = locations.lastObject;
        NSLog(@"经度:%f,纬度:%f",location.coordinate.longitude,location.coordinate.latitude);
        //5.停止定位
        [self.locatitonManager stopUpdatingLocation];
    
    }
    

    3. 地图的持续定位

    • 什么是持续定位

      前面说过,地图位置刷新的代理didUpdateLocations会持续调用,手机非常耗电
      如果被用户不小心发现你的APP非常耗电,这对产品来说将会是一个致命的打击
      我们避免这种问题的方式就是在didUpdateLocations这个代理中调用停止更新的方法stopUpdatingLocation来保证只获取到一次定位

    在实际开发中,有一些APP确实需要用到持续定位的功能,主要有以下三种类型
    1.地图类:需要时时获取用户位置来刷新,尤其是导航功能
    2.运动类:跑步或者骑行的时候需要不停的获取用户的位置来绘制跑步路线
    3.天气类:此类应用的刷新频率没有以上两种那么频繁,一般处理是隔半个小时或者一个小时刷新一下用户位置,因为不同的城市天气是不一样的

    • 如何进行持续定位
      是不是只需要不在'didUpdateLocations'这个方法中调用stopUpdatingLocation就可以了
      理论上是可以的,但是这样子应用耗电会非常的大

    • 那如何在保证持续定位的前提下降低APP的耗电量
      (1)不在'didUpdateLocations'这个方法中调用stopUpdatingLocation让系统持续调用代理
      (2)设置定位过滤
      (3)设置精准度

    不多说,直接上代码
    -(void)viewDidLoad {
    [super viewDidLoad];

        //1.创建CLLocationManager
        self.locationManager = [[CLLocationManager alloc] init];
    
        //2.请求授权
        if ([[UIDevice currentDevice].systemVersion floatValue]>=8) {
            //使用时授权
            [self.locationManager requestWhenInUseAuthorization];
        }
        //3.设置代理
        self.locationManager.delegate = self;
    
        //4.开始定位
        [self.locationManager startUpdatingLocation];
    
    
        //持续定位
        /**
         1.开启开始定位之后,不关闭,让其持续定位
         2.设置距离筛选器:坐标移动到指定距离才会调用代理方法
         3.设置精准度:通过降低计算的过程(GPS),来达到省电的目的
         **/
    
        //传入的是double值,单位是米,这里传入10,表示距离移动超过十米,才会调用代理方法
        self.locationManager.distanceFilter = 10;
    
        //GPS精准度  默认值:kCLLocationAccuracyBest   最精准:kCLLocationAccuracyBestForNavigation
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    }
    
    //CLLocationManagerDelegate
    -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
    {
           NSLog(@"%@",locations.lastObject);
    }
    

    相关文章

      网友评论

          本文标题:iOS开发-地图及定位

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