您的位置:首页 > 移动开发 > IOS开发

iOS地图 -- 定位初使用

2016-09-05 20:39 316 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: