地图篇-01.获取用户位置
Posted 二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了地图篇-01.获取用户位置相关的知识,希望对你有一定的参考价值。
地图篇-01.获取用户位置
今天把地图整理了一下,共享出来和大家一起分享,希望帮助到不了解的朋友,当然很精通的朋友希望指正小生的不足.
1.说到地图,首先要接触一个framework -CoreLocation.framework
创建一个项目
点击"+"号之后,跳转到下个界面
导入完毕
2.原理:
大家平时在使用iPhone时,每下载一个App,第一次打开的时候,都会有这样的提示
是吧,这时候我们如果选择了不允许的话,这个App是获取不了我们的位置的,相应的App里面涉及到位置的功能我们都用不了(比如微信和QQ的"附近的人")
所以每次我都被App的意志强奸,选择允许
那么,如果选择了不允许之后,又想选择允许怎么办呢?下图
可以到设置->隐私->定位服务里面去打开定位服务,所有的App,只要有定位功能的都会在这里面显示,还可以选择性打开自己想要打开的App定位
所以,在我们写代码的时候,第一步就要判断用户是否打开了定位服务.
接下来看下图
大家会从上图右侧看到,有的App是"使用期间",有的又是"始终",有的是"永不"
对,这是一个定位的状态,或者说模式,就是说你希望什么时候用这个App的定位服务,或者是不使用
点进去会看到如下图示
和下图
大家又会发现在以上两张图片中,微博比手机淘宝多了一个字段,这是为什么呢?
首先,在ios8之后,获取用户位置需要在info.plist文件中添加字段,下图
常用字段:NSLocationAlwaysUsageDescription(始终)和NSLocationWhenInUseUsageDescription(使用期间),如果只添加一个,就会像上图那样有的只有使用期间,或者有的只有始终,亦或者有的App两者都有
所以,在判断用户打开定位服务之后,我们要判断用户的授权状态
3.在写代码之前,先来理理逻辑:
大家都知道在日常生活中,我们使用地图的时候,基本都是用经纬度来表示位置(要是不知道这个的话可以问问科学家),在iOS编码中也一样,也是用经纬度来表示用户位置,大家看到的地址名字不过是地理编码后显示的文本.
上述步骤完成之后,我们就可以开始定位了.
4.代码
1 // 2 // ViewController.m 3 // 地图 4 // 5 // Created by admin on 16/5/21. 6 // Copyright © 2016年 邓驹. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 //导入头文件(也可以创建一个pch文件,在pch文件中导入下面头文件) 12 #import <CoreLocation/CoreLocation.h> 13 14 @interface ViewController ()<CLLocationManagerDelegate> 15 16 @property (nonatomic, strong) CLLocationManager *manager; 17 18 @end 19 20 @implementation ViewController 21 22 - (void)viewDidLoad { 23 [super viewDidLoad]; 24 //1.判断用户是否开启定位服务 25 if (![CLLocationManager locationServicesEnabled]) { 26 NSLog(@"请开启定位服务"); 27 return; 28 } 29 //2.判断用户授权状态 30 if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) { 31 //请求用户授权 32 //后台可以定位 33 // [self.manager requestAlwaysAuthorization]; 34 //允许在前台使用GPS描述,后台不能定位 35 [self.manager requestWhenInUseAuthorization]; 36 } 37 //3.开始定位 38 [self.manager startUpdatingLocation]; 39 } 40 41 -(CLLocationManager *)manager { 42 if (!_manager) { 43 _manager = [[CLLocationManager alloc] init]; 44 //定位精度(误差) 45 _manager.desiredAccuracy = kCLLocationAccuracyBest; 46 //位置更新的最小距离(如果不设置这个属性,程序会一直获取用户当前位置,是非常耗电的) 47 _manager.distanceFilter = 100; 48 _manager.delegate = self; 49 } 50 return _manager; 51 } 52 53 /** 54 * 当获取到用户位置的时候调用 55 * 56 * @param manager 当前manager 57 * @param locations 用户的位置 58 */ 59 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { 60 //获取用户的最新位置 61 CLLocation *userLocal = [locations lastObject]; 62 //停止定位 63 [self.manager stopUpdatingHeading]; 64 //通过经纬度来获取用户位置 65 //纬度 66 CLLocationDegrees latitude = userLocal.coordinate.latitude; 67 //经度 68 CLLocationDegrees longtitude = userLocal.coordinate.longitude; 69 NSLog(@"纬度:%f,经度:%f",latitude,longtitude); 70 } 71 72 - (void)didReceiveMemoryWarning { 73 [super didReceiveMemoryWarning]; 74 // Dispose of any resources that can be recreated. 75 } 76 77 @end
打印结果:
1 2016-05-21 19:40:37.242 地图[2172:76214] 纬度:37.785834,经度:-122.406417
东经为正数,西经为负数
取值范围:-180~180
北纬为正数,南纬为负数
取值范围:-90~90
注意:
CLLocationManager创建对象,必须要用强引用,不然可能会提前释放.
5.计算两点间的距离
1 /** 2 * 计算两点间的距离 3 */ 4 -(void)calculateDistance{ 5 CLLocation *beijing = [[CLLocation alloc] initWithLatitude:39.54 longitude:116.28]; 6 CLLocation *chengdu = [[CLLocation alloc] initWithLatitude:30.67 longitude:104.06]; 7 //计算距离(单位是米) 8 CLLocationDistance distance = [beijing distanceFromLocation:chengdu]; 9 NSLog(@"北京到成都的距离是:%f米",distance); 10 }
打印结果:
1 2016-05-21 19:50:06.315 地图[2201:79784] 北京到成都的距离是:1483882.846655米
本节内容到这就完了,下一节是地理编码,望大家指正,不明白的可以评论或者留言,我会第一时间回复.谢谢
以上是关于地图篇-01.获取用户位置的主要内容,如果未能解决你的问题,请参考以下文章
如何在不渲染地图的情况下获取用户位置数据 - Leaflet