iOS关于地图定位基础(一)
来源:互联网 发布:python实战案例 编辑:程序博客网 时间:2024/06/05 04:15
若看完这篇的朋友,可以查看我的下一篇iOS关于地图定位基础(二)
随着更多的LBS(Location Based Service)业务被集成到手机应用 同时鉴于在iOS中地图的学习是看了又忘,忘了又看,这次就干脆完完整整的写一篇关于iOS中地图的文章来供自己学习.大家如果觉得还行的话可以顶一下哦.
在iOS中若想实现地图定位大体的方案主要是 苹果原生 和 百度SDK 两种 . 接下来我们先开始讨论苹果原生的方案 . 在iOS中使用原生方案实现地图定位 , 必须依托两个自带框架CoreLocation<主要实现地理定位、地理编码、区域监听等功能性的实现> 和MapKit <地图展示,如大头针、路线、覆盖层等界面的展示>.
CoreLocation 的使用 ,首先需要创建CLLocationManager 对象 , 代码如下:
#import "ViewController.h"#import <CoreLocation/CoreLocation.h>@interface ViewController () <CLLocationManagerDelegate> // 定位管理者协议/** * 定位管理者(避免局部变量销毁) */@property (strong, nonatomic) CLLocationManager * clManager;@end@implementation ViewController#pragma mark - lazy- (CLLocationManager *)clManager { if (!_clManager) { _clManager = [[CLLocationManager alloc] init]; // 设置代理 _clManager.delegate = self; if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // 代码获取用户授权(前台定位) [_clManager requestWhenInUseAuthorization]; // 获取前后台定位 优先级大于前台定位// [_clManager requestAlwaysAuthorization]; } if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) { // 代码允许后台定位(在代码授权为前台定位情况下,要实现后台定位) _clManager.allowsBackgroundLocationUpdates = YES; } } return _clManager;}然后我们调用CLLocationManager 的下面这个实例方法来开启定位
- (void)startUpdatingLocation;
但是奇迹发生了,运行程序后没有任何的效果(理论上手机界面会弹出是否允许使用定位的用户授权弹框),而且控制台也打印了些信息如下:
大体意思是,如果我们想要使用定位功能,就必须在项目的 Info.plist 文件中添加一个叫做 NSLocationAlwaysUsageDescription 或 NSLocationWhenInUseUsageDescription 的键值,而对应的value值是字符串类型,可以自定义一些授权弹框中的描述信息。如下图:
到目前为止,我们的应用就可以简单定位了,我们在弹出的授权弹框中选择允许,如下图:
并实现对应定位回调代理方法,发现代理方法不停的进行调用(不停的定位)
#pragma mark - CLLocationManagerDelegate- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { NSLog(@"已经获取定位~"); }
到此地图定位基础第一部分暂时写到这,下面总结一些相关的零碎知识点。
① 关于iOS8+的定位授权方法有两个,分别是
// 应用在前台时可以获取用户定位信息- (void)requestWhenInUseAuthorization;// 无论应用在前台或后台都能获取用户定位信息- (void)requestAlwaysAuthorization;// 但是两个方法如若都实现了,按照授权范围的包含和被包含关系,是以权限大的为基准,也就是以前后台定位授权方法为准。
② 在iOS8+中,代码授权若使用前台授权定位方法 ,在不改动代码情况下是否也能再实现后台定位呢?其实在工程项目中也可以进行相应设置实现。。。如下图(PS:同时如果我们的系统是iOS9+ 需要代码中设置允许后台定位的属性):
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) { // 代码允许后台定位(在代码授权为前台定位情况下,要实现后台定位) _clManager.allowsBackgroundLocationUpdates = YES; }
只不过当我们的应用退到后台时,屏幕顶部会有蓝色定位提醒框,如下图:
③ 关于用户的授权状态的监听 ( 这里定位管理者 CLLocationManager 也是通过代理的方式进行监听的)我们可以在代理方法中对状态参数status 进行分支判断 来查看当前授权状态 代理方法如下:
// 授权状态一旦改变 就会调用次代理方法- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { NSLog(@"授权状态发生改变!"); // CLAuthorizationStatus 授权状态 枚举类型 typedef NS_ENUM(int, CLAuthorizationStatus) { // 用户还未决定是否授权 只有处在这种状态 应用才会弹出授权弹框 kCLAuthorizationStatusNotDetermined = 0, // 定位权限受限 kCLAuthorizationStatusRestricted, // 用户拒绝授权定位 kCLAuthorizationStatusDenied, // 用户授权前后台都可定位 kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(10_12, 8_0), // 用户授权前台定位 kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0), }}
④ 这里还有最后一个注意点 无论我们在手机上设置界面关闭定位服务还是拒绝授权定位 在授权状态代理方法中都是拒绝状态
// kCLAuthorizationStatusDenied 在确定是拒绝状态下 进一步判断 if ([CLLocationManager locationServicesEnabled]) { NSLog(@"用户拒绝授权状态 - 提醒用户开启相应授权操作"); } else { NSLog(@"用户关闭定位功能状态 - 提醒用户开启定位功能"); }
⑤ 下面附上用户手机设置页面对应的定位选项截图:
- iOS关于地图定位基础(一)
- iOS关于地图定位基础(二)
- iOS原生地图基础(一)
- iOS百度地图后台持续定位(一)
- iOS 地图SDK的使用 -- 定位基础
- iOS 关于iOS8地图定位问题
- 关于iOS中地图定位新问题
- iOS学习笔记 地图(一)定位CoreLocation
- 地图与定位(一)定位服务
- swift 地图定位(一)
- 关于百度地图的基础地图和定位功能
- IOS -定位(一)
- 百度地图定位基础
- 百度地图定位跳转 (iOS)
- iOS地图定位小功能(上)
- IOS地图定位
- IOS地图定位
- IOS 地图定位概要
- 关于开关电源PCB设计中存在的问题
- P2P系统中的DHT算法分析
- 八个Docker的真实应用场景
- spring IOC
- wifi的两种工作模式
- iOS关于地图定位基础(一)
- Java8 lambda学习日记(1)
- JAVA WEB 浏览器兼容问题汇总
- android SQLite的使用
- MySQL数据库命名规范及约定
- 单片机的C语言编程中所用的语言推荐规范
- 摘要下java基础小结
- 一些我记不住的东西
- 关于轮子跟造轮子。