iOS开发-地图及定位

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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容