一、简介
- 从
iOS6
开始,苹果在保护用户隐私
方面做了很大的加强,以下操作都必须经过用户批准授权
- 要想获得用户的位置
- 想访问用户的通讯录、日历、相机、相册等等
- 当想访问用户的隐私信息时,系统会
自动
弹出一个对话框让用户授权
- 一旦用户选择了“Don’tAllow”,意味着你的应用以后就无法使用定位功能 -> 定位开启,被拒绝
-
ios8-:需要截图提醒用户并引导用户开启
-
开发者可以在Info.plist文件中配置:说明定位的目的
-
配置:
配置定位目的.png -
效果图:
配置后弹出用户授权对话框.png
-
二、标准定位服务 与 监听重大位置的改变(基于基站)
1、
标准定位服务
(基于gps/wifi/基站)
-
标准定位服务(基于gps/基站/wifi定位, 具体使用哪种,苹果有自己规则)
-
特点:
程序关闭,就没法获取位置
-
开始定位方法:
[self.locationM startUpdatingLocation];
2、
监听重大位置的改变
(基于基站进行定位)
-
要求, 设备必须有电话模块
-
特点:
- 当app被完全
关闭时,也可以接收到位置通知
,并让app进入
到后台
处理 - 定位精度相比于上面,
定位精度不大,所以耗电小
,而且定位更新频率依据基站密度而定
- 当app被完全
-
开始定位方法:
[self.locationM startMonitoringSignificantLocationChanges];
```
应用场景
- 1> 如果要求定位及时,精度较高,并且运行时间较短,可使用标准定位;
- 2> 如果长时间监控用户位置,用户移动速度比较快(例如打车软件),可使用后者
三、iOS8.0- 的定位实现
1、前台定位
- 1.导入CoreLocation框架和对应的主头文件
import <CoreLocation/CoreLocation.h>
```
- 2.创建CLLcationManager对象,并设置代理
_locationM = [[CLLocationManager alloc] init]; _locationM.delegate = self; ```
- 3.调用CLLcationManager对象的startUpdatingLocation方法进行更新用户位置
[_locationM startUpdatingLocation]; ```
- 4.实现代理方法,接收位置参数
-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations
```
基本使用
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
/** 位置管理者 */
@property (nonatomic, strong) CLLocationManager *locationM;
@end
@implementation ViewController
#pragma mark -懒加载
-(CLLocationManager *)locationM
{
if (!_locationM) {
//1 创建位置管理者
_locationM = [[CLLocationManager alloc] init];
// 1.1 告诉外界位置的方案: 代理, block 通知
_locationM.delegate = self;
// 设置每隔多远定位一次(1次 111km/100m)
// 最新的位置距离上一次位置之间的距离大于100m, 才会通过代理告诉外界
// _locationM.distanceFilter = 100;
// kCLLocationAccuracyBestForNavigation // 最适合导航
// kCLLocationAccuracyBest; // 最好的
// kCLLocationAccuracyNearestTenMeters; // 附近10米
// kCLLocationAccuracyHundredMeters; // 100米
// kCLLocationAccuracyKilometer; // 1000米
// kCLLocationAccuracyThreeKilometers; // 3000米
// 定位精确度
// 定位精确度越高, 越耗电, 而且, 定位时间越长
_locationM.desiredAccuracy = kCLLocationAccuracyBest;
}
return _locationM;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 2. 使用位置管理者, 开始获取用户位置
// 开发经验: start 开始某个服务 stop 停止某个服务
// 一旦调用了这个方法, 那么就会不断的获取用户位置信息, 然后告诉外界
// 默认情况,只能在前台获取用户位置信息, 如果我们想要在后台获取位置, 必须勾选后台模式 location updates
// 标准定位服务(基于gps/wifi/基站)
[self.locationM startUpdatingLocation];
// 监听重大位置的改变(基于基站进行定位 , 要求, 设备必须有电话模块)
// [self.locationM startMonitoringSignificantLocationChanges];
}
#pragma mark -CLLocationManagerDelegate
// 当获取到用户位置信息时调用
// manager : 位置管理者
// locations: 位置数组
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"定位到了");
// 一般我们开发中, 获取到用户位置信息之后, 做一些业务逻辑操作
// 针对于定位一次的情况, 可以在定位到之后 停止获取用户位置
// [manager stopUpdatingLocation];
}
@end
2、后台定位
- 1.在前台定位基础上,
勾选后台模式
:update locations(如下图)
网友评论