CoreLocation框架的使用

// 首先导入头文件
#import <CoreLocation/CoreLocation.h>
  • CoreLocation框架中所有数据类型的前缀都是CL
  • CoreLocation中使用CLLocationManager对象来做用户定位

1.CLLocationManager的使用

CLLocationManager的常用操作

/**
* 定位管理者,全局变量强引用,防止销毁
*/
@property (nonatomic ,strong) CLLocationManager *mgr;

设代理

// 2.成为CoreLocation管理者的代理监听获取到的位置
self.mgr.delegate = self;

①得到用户授权

注意:

iOS7只要开始定位, 系统就会自动要求用户对你的应用程序授权. 但是从iOS8开始, 想要定位必须先"自己""主动"要求用户授权

  • 添加友好提示,在info.plist文件中添加字段

    • Privacy - Location Usage Description

在iOS8中不仅仅要主动请求授权,而且必须再info.plist文件中配置一项属性才能弹出授权窗口

  • NSLocationWhenInUseDescription,允许在前台获取GPS的描述
  • NSLocationAlwaysUsageDescription,允许在后台获取GPS的描述
 /*
用户从未选择过权限
kCLAuthorizationStatusNotDetermined
无法使用定位服务,该状态用户无法改变
kCLAuthorizationStatusRestricted
用户拒绝该应用使用定位服务,或是定位服务总开关处于关闭状态
kCLAuthorizationStatusDenied
已经授权(废弃)
kCLAuthorizationStatusAuthorized
用户允许该程序无论何时都可以使用地理信息
kCLAuthorizationStatusAuthorizedAlways
用户同意程序在可见时使用地理位置
kCLAuthorizationStatusAuthorizedWhenInUse
*/ // 1.获得用户授权状态
CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; // 2.判断用户是否授权
if (status == kCLAuthorizationStatusNotDetermined) {
NSLog(@"等待用户授权");
}else if (status == kCLAuthorizationStatusAuthorizedAlways ||
status == kCLAuthorizationStatusAuthorizedWhenInUse) {
NSLog(@"授权成功");
// 开始定位
[self.mgr startUpdatingLocation]; }else
{
NSLog(@"授权失败");
}

iOS8请求授权得不到提示的原因

  • 1.没有发送请求

    • 无请求代码
  • 2.CLLocationManager不是全局的成员属性
    • 被提前销毁,没有强引用
  • 3.没有在info.plist文件中添加字段
    • NSLocationAlwaysUsageDescription
    • NSLocationWhenInUseDescription

②开始用户定位

- (void)startUpdatingLocation;

③停止用户定位

- (void) stopUpdatingLocation;

③设置当用户移动多少米,重新定位

- self.mgr.distanceFilter = 50;

④设置获取位置的精确度

  • 越精确就越耗电
    /*
kCLLocationAccuracyBestForNavigation 最佳导航
kCLLocationAccuracyBest; 最精准
kCLLocationAccuracyNearestTenMeters; 10米
kCLLocationAccuracyHundredMeters; 百米
kCLLocationAccuracyKilometer; 千米
kCLLocationAccuracyThreeKilometers; 3千米
*/
self.mgr.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
  • 当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法调用频率非常高

  • 如果只需要获取一次, 可以获取到位置之后就停止

    • [manager stopUpdatingLocation];
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
//locations参数里面装着CLLocation对象

在startUpdatingLocation 代理方法中可以得到用户的坐标信息


// 1.获取最后一次的位置
CLLocation *location = [locations lastObject];
/*
location.coordinate; 坐标, 包含经纬度
location.altitude; 设备海拔高度 单位是米
location.course; 设置前进方向 0表示北 90东 180南 270西
location.horizontalAccuracy; 水平精准度
location.verticalAccuracy; 垂直精准度
location.timestamp; 定位信息返回的时间
location.speed; 设备移动速度 单位是米/秒, 适用于行车速度而不太适用于不行
*/
/*
可以设置模拟器模拟速度
bicycle ride 骑车移动
run 跑动
freeway drive 高速公路驾车
*/
CLLocation *location = [locations lastObject];
NSLog(@"%f, %f speed = %f", location.coordinate.latitude , location.coordinate.longitude, location.speed);

计算两地之间的直线距离

  • (CLLocationDistance)distanceFromLocation:(const CLLocation *)location;
    // 北京:39.6 116.39
// 广州:23.08 113.15
CLLocation *BeiJing = [[CLLocation alloc] initWithLatitude:39.6 longitude:116.39];
CLLocation *GuangZhou = [[CLLocation alloc] initWithLatitude:23.08 longitude:113.15]; // 得到两地之间的距离
CLLocationDistance distance = [BeiJing distanceFromLocation:GuangZhou];
NSLog(@"%.2f", distance);

2、CLLocation

  • CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等
// 属性
location.coordinate; 坐标, 包含经纬度
location.altitude; 设备海拔高度 单位是米
location.course; 设置前进方向 0表示北 90东 180南 270西
location.horizontalAccuracy; 水平精准度
location.verticalAccuracy; 垂直精准度
location.timestamp; 定位信息返回的时间
location.speed; 设备移动速度 单位是米/秒, 适用于行车速度而不太适用于不行 // 可以计算2个位置之间的距离
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location

3、CLGeocoder

  • 使用CLGeocoder可以完成“地理编码”和“反地理编码”

地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)

反地理编码:根据给定的经纬度,获得具体的位置信息

// 地理编码方法
- geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {}; // 反地理编码方法
- reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {};

CLPlacemark的字面意思是地标,封装详细的地址位置信息

1.CLPlacemark的addressDictionary属性 遍历字典数据

addressDictionary enumerateKeysAndObjectsUsingBlock

2.block是在主线程调用,所以可以直接在block刷新UI

name                    :   地名
thoroughfare : 街道
ubThoroughfare : 街道相关信息,例如门牌等
locality : 城市
subLocality : 城市相关信息,例如标志性建筑
administrativeArea : 直辖市
subAdministrativeArea : 其他行政区域信息
postalCode : 邮编
ISOcountryCode : 国家编码
country; : 国家
inlandWater : 水源、湖泊
ocean; : 海洋
areasOfInterest : 关联的或利益相关的地标 @property (nonatomic, readonly) CLLocation *location;
// 地理位置 @property (nonatomic, readonly) CLRegion *region;
// 区域 @property (nonatomic, readonly) NSDictionary *addressDictionary;
// 详细的地址信息 @property (nonatomic, readonly) NSString *name;
// 地址名称 @property (nonatomic, readonly) NSString *locality;
// 城市

错误:使用CoreLocation获取地理位置信息,报错

Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"

解决方法:

  • 1.确定模拟器(手机)已经联网并且允许程序获取地理位置
  • 2.重置地理位置服务或者网络服务

  • PS:如果是模拟器就果断直接重置模拟器吧 IOS Simulator - Reset Content and Settings..。

中国经纬度

中国的经纬度范围

  • 纬度范围:N 3°51′ ~ N 53°33′
  • 经度范围:E 73°33′ ~ E 135°05′

中国部分城市的经纬度

iOS定位--CoreLocation框架的更多相关文章

  1. 地图定位CoreLocation框架,地理位置编码与反编码

    在现代互联网时代,越来越多的应用,都用到了地图定位功能,在iOS开发中,想要加入这种功能,必须基于两个框架进行开发: 1.Map Kit:用于显示地图, 2.CoreLocation:用于显示地理位置 ...

  2. iOS定位--CoreLocation

    一:导入框架 #import <CoreLocation/CoreLocation.h> 二:设置代理及属性 <CLLocationManagerDelegate> @prop ...

  3. 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  4. 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  5. 【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  6. 【iOS】7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  7. 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  8. 【iOS】7.4 定位服务->2.1.4 定位 - 官方框架CoreLocation 案例:指南针效果

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  9. IOS CoreLocation框架的使用(用于地理定位)

    ●  在移动互联网时代,移动app能解决用户的很多生活琐事,比如 ●  导航:去任意陌生的地方 ●  周边:找餐馆.找酒店.找银行.找电影院 ●  在上述应用中,都用到了地图和定位功能,在iOS开发中 ...

随机推荐

  1. Codeforces 757 D. Felicity's Big Secret Revealed 状压DP

    D. Felicity's Big Secret Revealed   The gym leaders were fascinated by the evolutions which took pla ...

  2. Linux的进程优先级NI和PR到底有什么区别

    Linux的进程优先级NI和PR到底有什么区别 - 51CTO.COM http://os.51cto.com/art/201605/511559.htm

  3. swift中的@objc的作用

    转载:https://www.jianshu.com/p/6c5b45d9d042 自动清除冗余代码减小包大小 得益于 Swift 的静态语言特性,每个函数的调用在编译期间就可以确定.因此在编译完成后 ...

  4. UVALive3126 Taxi Cab Scheme —— 最小路径覆盖

    题目链接:https://vjudge.net/problem/UVALive-3126 题解: 最小路径覆盖:即在图中找出尽量少的路径,使得每个结点恰好只存在于一条路径上.其中单独一个点也可以是一条 ...

  5. C语言算法

    选择排序法:用第一个数分别和后面的数比较 冒泡排序法:相邻的两个数比较 01.单词首字母大写&统计单词个数 02: 编写一个函数int pieAdd(int n),计算1!+2!+3!+……+ ...

  6. BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数

    BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数 Description 丢番图是亚历山大时期埃及著名的数学家.他是最早研究整数系数不定方程的数学家之一. 为了纪念他,这些方程一般被称 ...

  7. [USACO 2017DEC] Greedy Gift Takers

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5139 [算法] 二分答案 时间复杂度 : O(NlogN^2) [代码] #incl ...

  8. bzoj4806 炮——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4806 看到这题首先会想到状压什么乱七八糟的,然而很难做: 其实,因为求的是方案数,所以并不需 ...

  9. python名片管理系统

    1.代码: (1)主程序 #!/usr/bin/env python # -*- coding: UTF-8 -*- import cards_tools # 无限循环,由用户主动决定什么时候退出循环 ...

  10. 获取http请求的响应状态

    import urllib.request url="http://www.baidu.com" #返回一个对象 response=urllib.request.urlopen(u ...