在现在,很多app开发都会用到导航(去任意地方)、查找周边(找餐厅、银行、电影院等)
所以会用到两个框架进行开发:
Map Kit 用于地图展示
Core Location 用于地理定位
先介绍两个热门的专业术语
LBS Location Based Service 基于定位的服务
SoLoMo Social Local Mobile(索罗门)移动互联网和电商要搞的东西
CoreLocation框架的使用
导入框架:Xcode 5以后版本不需要导入
导入头文件
#import <CoreLocation/CoreLocation.h>
特点:CoreLocation框架中所有数据类型的前缀都是CL
其中CLLocationManager比较重要,用来做用户定位
代码实现
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
//定位管理者
@property (strong ,nonatomic)CLLocationManager *manager;
@end
@implementation ViewController
#pragma mark - 懒加载
-(CLLocationManager*)manager{
if (!_manager) {
_manager = [[CLLocationManageralloc]init];
}
return _manager;
}
- (void)viewDidLoad {
[superviewDidLoad];
//1.创建成为CoreLocation管理者
//CLLocationManager *manager = [[CLLocationManager alloc]init];
//不要在这里定义,因为我们用管理者去监听当我们viewDidLoad调用玩,管理者就不存在了,就无法监听到了
//2.成为CoreLocation管理者的代理,来监听获取到的位置
self.manager.delegate =self;
//设置多久获取一次(多少米)
//self.manager.distanceFilter = 100;
//设置获取位置的精确度
//self.manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
/**
kCLLocationAccuracyBestForNavigation;最佳导航
kCLLocationAccuracyBest;最精准
kCLLocationAccuracyNearestTenMeters;十米
kCLLocationAccuracyHundredMeters;百米
kCLLocationAccuracyKilometer;千米
kCLLocationAccuracyThreeKilometers;三千米
*/
/**
注意:iOS7要开始定位,系统就会自动要求用户对你的应用程序授权。但是iOS8开始,想要定位必须“自己”主动要求用户授权。
在iOS8以上版本中不仅仅要主动请求授权,而且必须在info.plist文件中配置一项属性才能弹出授权窗口
根据下面使用哪种授权方法添加对应的配置
NSLocationWhenInUseDescription 允许在前台获取GPS的描(requestWhenInUseAuthorization)
NSLocationAlwaysUsageDescription 允许在后台获取GPS的描述(requestAlwaysAuthorization)
*/
//判断版本是否大于等于iOS8
if([[UIDevicecurrentDevice].systemVersiondoubleValue] >= 8.0){
//主动要求用户对我们程序授权(两种授权方法),授权状态改变就会通知代理
[self.managerrequestAlwaysAuthorization];//请求前台和后台定位权限
//[self.manager requestWhenInUseAuthorization];//请求前台定位权限
}else{
//3.开始监听(开始获取位置)
[self.managerstartUpdatingLocation];
}
}
/**
授权发生改变时调用
manager 触发事件的对象
status 当前授权的状态
kCLAuthorizationStatusNotDetermined,用户从未选择过权限
kCLAuthorizationStatusRestricted,无法使用定位服务,该用户状态无法改变
kCLAuthorizationStatusDenied,用户拒绝应用使用定位服务,或是定位服务总开关处于关闭状态。
kCLAuthorizationStatusAuthorized,已经授权(该方法已废弃)
kCLAuthorizationStatusAuthorizedAlways,用户允许该程序无论何时都可以使用地理信息
kCLAuthorizationStatusAuthorizedWhenInUse,用户同意在可见时使用地理位置
*/
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
if(status ==kCLAuthorizationStatusNotDetermined){
NSLog(@"等待用户授权");
}elseif (status ==kCLAuthorizationStatusAuthorizedAlways||status ==kCLAuthorizationStatusAuthorizedWhenInUse){
NSLog(@"授权成功");
//开始定位
[self.managerstartUpdatingLocation];
}else{
NSLog(@"授权失败");
}
}
#pragma mark - CLLocationManagerDelegate
/**
获取到位置信息就会调用(调用频率非常高)
manager 触发事件的对象
locations 获取到的位置
*/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
NSLog(@"%s" , __func__);
//如果只需要获取一次,可以获取到一次就停止
//[self.manager stopUpdatingLocation];
}
@end
//模拟器运行时没有位置,所以我们要设置位置,点击Debug->Location->Custom Location
设置位置
如果运行iOS8版本及以上模拟器还没能出现下图
可尝试先运行一下iOS7版本的模拟器,然后再运行iOS8版本及以上模拟器即可出现结果。
(我会尽快完成书写MapKit/CoreLocation使用方法的后续博客,转载的话请声明转载地址)