地图篇-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.获取用户位置的主要内容,如果未能解决你的问题,请参考以下文章

地图篇-05.导航

如何在不渲染地图的情况下获取用户位置数据 - Leaflet

怎么用百度地图api自动获取当前位置(谷歌的也行)

无法在 swift xcode 7.1 中的地图上获取用户位置

放置图钉并从用户在地图上点击的位置获取地址

在不使用地图Android的情况下获取用户(纬度,经度)位置[重复]