博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS地图 -- 定位初使用
阅读量:6804 次
发布时间:2019-06-26

本文共 6176 字,大约阅读时间需要 20 分钟。

  • iOS的定位服务用到的框架是#import <CoreLocation/CoreLocation.h>
  • 定位中用到的类是CLLocationManager

一.iOS8.0之前的定位

  • 向用户描述授权的信息需要在info.plist中配以下key

762322-20160905203450144-814336053.png

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

762322-20160905203510535-1608850064.png

二.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
*)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 
@interface ViewController ()
/** 位置管理者 */@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
*)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

转载地址:http://aejwl.baihongyu.com/

你可能感兴趣的文章
Android Framework中的线程Thread及它的threadLoop方法
查看>>
Oracle单实例情况下的library cache pin的问题模拟与问题分析
查看>>
Oracle XE安装具体解释
查看>>
Nginx之web服务器
查看>>
__autoload函数
查看>>
Sicily 7693. Cards 解题报告
查看>>
Windows phone 7开发--页面间跳转与传值
查看>>
bzoj5450 轰炸
查看>>
p1552 [APIO2012]派遣
查看>>
[BZOJ 2002][Hnoi 2010]Bounce 弹飞绵羊
查看>>
1045 access denied for user 'root'@'localhost' using password yes
查看>>
接口测试基础
查看>>
asp.net+ajax+WebServer 输入自动提示历史记录
查看>>
JDK1.8源码分析之HashMap(一) (转)
查看>>
常见的反爬虫和应对方法 (转)
查看>>
intellij idea 高级用法之:集成JIRA、UML类图插件、集成SSH、集成FTP、Database管理(转)...
查看>>
将Sublime Text 2搭建成一个好用的IDE(转)
查看>>
Java 理论与实践: 正确使用 Volatile 变量(转)
查看>>
[转]解决get方法传递URL参数中文乱码问题
查看>>
维生素和止痛药的区别
查看>>