iOS地图 -- 定位初使用
- iOS的定位服务用到的框架是
#import <CoreLocation/CoreLocation.h> - 定位中用到的类是
CLLocationManager
一.iOS8.0之前的定位
- 向用户描述授权的信息需要在info.plist中配以下key

- 后台情况下开启定位服务需要进行如下图配置

二.iOS8.0之后的定位(包含iOS8.0)
- iOS8.0之后前台定位授权和后台定位授权需要调用下面对应的方法
// 前台定位授权 官方文档中说明info.plist中必须有NSLocationWhenInUseUsageDescription键
[_mgr requestWhenInUseAuthorization];
或者
// 前后台定位授权 官方文档中说明info.plist中必须有NSLocationAlwaysUsageDescription键
[_mgr requestAlwaysAuthorization];
三.版本不同的适配问题(两种方法)
- 方法一:
// 方法一:判断iOS版本号
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
// 前台定位授权 官方文档中说明info.plist中必须有NSLocationWhenInUseUsageDescription键
[_mgr requestWhenInUseAuthorization];
// 前后台定位授权 官方文档中说明info.plist中必须有NSLocationAlwaysUsageDescription键
[_mgr requestAlwaysAuthorization];
}
- 方法二:高大上的方法
// 方法二:判断位置管理者能否响应iOS8之后的授权方法
if ([_mgr respondsToSelector:@selector(requestAlwaysAuthorization)]) {
// // 前台定位授权 官方文档中说明info.plist中必须有NSLocationWhenInUseUsageDescription键
// [_mgr requestWhenInUseAuthorization];
// 前后台定位授权 官方文档中说明info.plist中必须有NSLocationAlwaysUsageDescription键
[_mgr requestAlwaysAuthorization];
}
三.其余细节问题
- 位置管理者的精确度
/**
kCLLocationAccuracyBestForNavigation; --> 最适合导航
kCLLocationAccuracyBest; --> 最好的
kCLLocationAccuracyNearestTenMeters; --> 附近10米
kCLLocationAccuracyHundredMeters; --> 100米
kCLLocationAccuracyKilometer; --> 1000米
kCLLocationAccuracyThreeKilometers; --> 3000米
*/
// 设置定位所需的精度 枚举值 精确度越高越耗电
self.mgr.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
- 位置管理者的过滤器,没移动制定的距离定位一次
// 每100米更新一次定位
self.mgr.distanceFilter = 100;
四.代理方法中获取定位到的位置信息,这里先不细讲,下一次笔记详细说明
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
NSLog(@"已经定位");
}
五.代理方法中监听授权状态的改变
// 代理方法中监听授权的改变,被拒绝有两种情况,一是真正被拒绝,二是服务关闭了
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
{
NSLog(@"用户未决定");
break;
}
// 系统预留字段,暂时还没用到
case kCLAuthorizationStatusRestricted:
{
NSLog(@"受限制");
break;
}
case kCLAuthorizationStatusDenied:
{
// 被拒绝有两种情况 1.设备不支持定位服务 2.定位服务被关闭
if ([CLLocationManager locationServicesEnabled]) {
NSLog(@"真正被拒绝");
// 跳转到设置界面
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
}
else {
NSLog(@"没有开启此功能");
}
break;
}
case kCLAuthorizationStatusAuthorizedAlways:
{
NSLog(@"前后台定位授权");
break;
}
case kCLAuthorizationStatusAuthorizedWhenInUse:
{
NSLog(@"前台定位授权");
break;
}
default:
break;
}
}
六.练习详细代码
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
/** 位置管理者 */
@property(nonatomic,strong) CLLocationManager *mgr;
@end
@implementation ViewController
#pragma mark - 懒加载
- (CLLocationManager *)mgr
{
if (_mgr == nil) {
// 实例化位置管理者
_mgr = [[CLLocationManager alloc] init];
// 指定代理,代理中获取位置数据
_mgr.delegate = self;
// 兼容iOS8之后的方法
// 方法一:判断iOS版本号
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
// 前台定位授权 官方文档中说明info.plist中必须有NSLocationWhenInUseUsageDescription键
[_mgr requestWhenInUseAuthorization];
// 前后台定位授权 官方文档中说明info.plist中必须有NSLocationAlwaysUsageDescription键
[_mgr requestAlwaysAuthorization];
}
// 方法二:判断位置管理者能否响应iOS8之后的授权方法
if ([_mgr respondsToSelector:@selector(requestAlwaysAuthorization)]) {
// // 前台定位授权 官方文档中说明info.plist中必须有NSLocationWhenInUseUsageDescription键
// [_mgr requestWhenInUseAuthorization];
// 前后台定位授权 官方文档中说明info.plist中必须有NSLocationAlwaysUsageDescription键
[_mgr requestAlwaysAuthorization];
}
}
return _mgr;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 开启位置更新
[self.mgr startUpdatingLocation];
/**
kCLLocationAccuracyBestForNavigation; --> 最适合导航
kCLLocationAccuracyBest; --> 最好的
kCLLocationAccuracyNearestTenMeters; --> 附近10米
kCLLocationAccuracyHundredMeters; --> 100米
kCLLocationAccuracyKilometer; --> 1000米
kCLLocationAccuracyThreeKilometers; --> 3000米
*/
// 设置定位所需的精度 枚举值 精确度越高越耗电
self.mgr.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
// 每100米更新一次定位
self.mgr.distanceFilter = 100;
}
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
NSLog(@"已经定位");
}
// 代理方法中监听授权的改变,被拒绝有两种情况,一是真正被拒绝,二是服务关闭了
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
{
NSLog(@"用户未决定");
break;
}
// 系统预留字段,暂时还没用到
case kCLAuthorizationStatusRestricted:
{
NSLog(@"受限制");
break;
}
case kCLAuthorizationStatusDenied:
{
// 被拒绝有两种情况 1.设备不支持定位服务 2.定位服务被关闭
if ([CLLocationManager locationServicesEnabled]) {
NSLog(@"真正被拒绝");
// 跳转到设置界面
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
}
else {
NSLog(@"没有开启此功能");
}
break;
}
case kCLAuthorizationStatusAuthorizedAlways:
{
NSLog(@"前后台定位授权");
break;
}
case kCLAuthorizationStatusAuthorizedWhenInUse:
{
NSLog(@"前台定位授权");
break;
}
default:
break;
}
}
@end
iOS地图 -- 定位初使用的更多相关文章
- iOS | 地图定位
在IOS开发中,最常见的功能之一就是地图定位功能,不单单是百度地图,高德地图等专业的地图导航软件,还有美团,咕咚等一些美食购物类和运动类也需要这样的功能,所以学会这项技能是一名IOS开发工程师必须的. ...
- 关于iOS地图定位中点击设置->隐私->定位服务 闪退问题
iOS8之后,如果应用中用到了地图定位,那么点击设置->隐私->定位服务 再点击该应用有时候会出现闪退问题,其原因是iOS8之后定位中添加了 NSLocationWhenInUseDesc ...
- iOS 地图定位及大头针的基本使用
地图 Part1 - 定位及大头针的基本使用 一.MapKit 作用 : 用于地图展示 如大头针,路线,覆盖层展示等(着重界面展示) 使用步骤 导入头文件 #import <MapKit/Map ...
- iOS地图 -- 定位中的CLLocation的介绍与小练习
通过定位练习,熟悉CLLocation 在上篇笔记中提到了CLLocation类,这里通过练习来讲解一下这个类,类中包含了获取到的用户位置的信息 coordinate --> 坐标,经度和纬度 ...
- ios8版本地图定位注意点
学习ios地图定位 我先定义一个属性: @property (weak, nonatomic) IBOutlet MKMapView *mapV; 然后在项目运行时初始化该属性一些参数: //设置地图 ...
- iOS之定位与地图
概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一 ...
- IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息
IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息 /**当获取到定位的坐标后,回调函数*/ - (void)didUpdateBMKUserLocation:(BMKUserLocati ...
- iOS 获取用户授权的用户隐私保护-地图定位
获取用户授权的用户隐私保护地图定位示例://导入定位框架#import<CoreLocation/CoreLocation.h>@interfaceViewController()< ...
- iOS 地图坐标系之间的转换WGS-84世界标准坐标、GCJ-02中国国测局(火星坐标,高德地图)、BD-09百度坐标系转换
开发过程中遇到地图定位不准确,存在偏差.首先确认你获取到的坐标所在坐标系跟地图数据是不是相匹配的. 常用的地图SDK:高德地图使用的是GCJ-02(也就是火星坐标系),百度使用的是BD-09百度坐标系 ...
随机推荐
- 1-学习前言&C语言概述
[C语言]01-学习前言&C语言概述 参考自 http://www.cnblogs.com/mjios/archive/2013/03/12/2956508.html#label2 C语言是我 ...
- 敏捷开发与jira之研发管理模式
以IPD方法论为基础,采用原型+迭代的开发模式,并以质量优先为原则,持续对用户做价值交付. 使用JIRA+WIKI+SVN管理整个的研发过程:JIRA管理任务和进度:SVN管理代码和过程文档:WIKI ...
- git review & devops过程
自己搭建的devops环境是gitlab/gerrit/jenkins 1. 首先自己checkout一个自己的代码分支,一般不要在master上做直接修改 2. 修改后git add file, ...
- Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作
Oracle中对数据对象和数据的管理,无疑都是使用PL/SQL Developer来进行管理,该工具也提供给我们很多方便.快捷的操作,使得我们不再为Oracle本身丑陋.难用的UI而抱怨.由于我们一般 ...
- ORA-01113: file xxxx needs media recovery
由于规范存储位置以及存储空间调整缘故需要移动表空间MRP_INDEX2的数据文件,如下所示,首先将表空间MRP_INDEX2脱机; 然后复制数据文件:接着重命名数据文件,最后将表空间MRP_INDEX ...
- .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)
阅读目录: 1.需求背景介绍(Model元数据设置项应该与View绑定而非ViewModel) 1.1.确定问题域范围(可以使用DSL管理问题域前提是锁定领域模型) 2.迁移ViewModel设置到外 ...
- C# Combobox 设置 value
因为ComboxItem是Object对象,而控件自身没有Value属性.所以,需要自定义一个类,用其对象来存储Text,Value. public class ComboxItem { ...
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转)
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...
- 测试几个xml的问题
使用sql server的时候,免不了与xml的参数打交道,xml大多数时候都给我们的程序带来方便,但是也有些时候会有变量赋值不通过的时候.(当然罗,如果你本身xml都通不过 xml spy 之类软件 ...
- 常用python机器学习库总结
开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处 ...