• 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地图 -- 定位初使用的更多相关文章

  1. iOS | 地图定位

    在IOS开发中,最常见的功能之一就是地图定位功能,不单单是百度地图,高德地图等专业的地图导航软件,还有美团,咕咚等一些美食购物类和运动类也需要这样的功能,所以学会这项技能是一名IOS开发工程师必须的. ...

  2. 关于iOS地图定位中点击设置->隐私->定位服务 闪退问题

    iOS8之后,如果应用中用到了地图定位,那么点击设置->隐私->定位服务 再点击该应用有时候会出现闪退问题,其原因是iOS8之后定位中添加了 NSLocationWhenInUseDesc ...

  3. iOS 地图定位及大头针的基本使用

    地图 Part1 - 定位及大头针的基本使用 一.MapKit 作用 : 用于地图展示 如大头针,路线,覆盖层展示等(着重界面展示) 使用步骤 导入头文件 #import <MapKit/Map ...

  4. iOS地图 -- 定位中的CLLocation的介绍与小练习

    通过定位练习,熟悉CLLocation 在上篇笔记中提到了CLLocation类,这里通过练习来讲解一下这个类,类中包含了获取到的用户位置的信息 coordinate --> 坐标,经度和纬度 ...

  5. ios8版本地图定位注意点

    学习ios地图定位 我先定义一个属性: @property (weak, nonatomic) IBOutlet MKMapView *mapV; 然后在项目运行时初始化该属性一些参数: //设置地图 ...

  6. iOS之定位与地图

    概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一 ...

  7. IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息

    IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息 /**当获取到定位的坐标后,回调函数*/ - (void)didUpdateBMKUserLocation:(BMKUserLocati ...

  8. iOS 获取用户授权的用户隐私保护-地图定位

    获取用户授权的用户隐私保护地图定位示例://导入定位框架#import<CoreLocation/CoreLocation.h>@interfaceViewController()< ...

  9. iOS 地图坐标系之间的转换WGS-84世界标准坐标、GCJ-02中国国测局(火星坐标,高德地图)、BD-09百度坐标系转换

    开发过程中遇到地图定位不准确,存在偏差.首先确认你获取到的坐标所在坐标系跟地图数据是不是相匹配的. 常用的地图SDK:高德地图使用的是GCJ-02(也就是火星坐标系),百度使用的是BD-09百度坐标系 ...

随机推荐

  1. 安装InfoPath 2013后 SharePoint 2010 出现 “找不到 Microsoft.Office.InfoPath, Version=14.0.0....” 的错误的解决方案

    1. 症状 您的SharePoint 2010的服务器是不是最近一直出现这个错误呢? Could not load file or assembly 'Microsoft.Office.InfoPat ...

  2. Linux系统NFS网络文件系统

    Linux系统NFS网络文件系统 NFS(network file system)网络文件系统,就是通过网络让不同的主机系统之间可以共享文件或目录,此种方法NFS客户端使用挂载的方式让共享文件或目录到 ...

  3. Android获取服务器Json字符串并显示在ListView上面

    已经好久没有更新博客,今天终于有新的东西可以记录了. 通过这次的任务学习到了以前没有注意到的知识点,真的有种书读百遍,其义自见的感觉.这次又重新认识了<Handler消息机制原理>.这次的 ...

  4. org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

    org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not a ...

  5. ImageView的ScaleType属性

    ImageView的ScaleType各种值代表的意义: CENTER:不进行任何缩放,将图片放在容器中间 CENTER_CROP:如果图片长宽都大于等于容器长宽,则图片不缩放,否则按固定长宽比缩放, ...

  6. SQL SERVER 2008:内部查询处理器错误: 查询处理器在执行过程中遇到意外错误

       今天一个同事突然告诉我,以前跑得很正常的一个SQL语句,执行时突然报如下错误:         消息1222,级别16,状态18,第1 行         已超过了锁请求超时时段.        ...

  7. StringUtils工具类

    StringUtils源码,使用的是commons-lang3-3.1包.下载地址 http://commons.apache.org/lang/download_lang.cgi 以下是String ...

  8. ligerDialog的使用

    1.通过ViewBag来传值. @if (ViewBag.ReturnMessage != null) 2.脚本代码: 对话框设计与赋值问题. <script type="text/j ...

  9. OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  10. MSSQL复制中的发布与订阅

    准备条件 1.2台服务器 2.WINDOWS SERVER 2008 64bit + 3.SQL SERVER 2008 R2 + 4.MSSQLSERVER服务与MSSQLAGENT服务正常运行中 ...