定位管理器
在处理相关地图的时候,有可能遇到一些问题,比如初次时候的时候,没有弹出地图的提示框,或者没有网络,或者没有显示地图
下面是相关的处理:
/*相关的博客http://my.oschina.net/are1OfBlog/blog/420034#OSC_h1_1
1. 要实现地图、导航功能,往往需要先熟悉定位功能,在iOS中通过Core Location框架进行定位操作。
2. Core Location自身可以单独使用,和地图开发框架MapKit完全是独立的,但是往往地图开发要配合定位框架使用。
3. 在Core Location中主要包含了定位、地理编码(包括反编码)功能。
在iOS8中配置配置项发生了变化,可以通过配置
NSLocationAlwaysUsageDescription
或者 NSLocationWhenInUseUsageDescription
来告诉用户使用定位服务的目的,并且注意这个配置是必须的,如果不进行配置则默认情况下应用无法使用定位服务,打开应用不会给出打开定位服务的提示,除非安装后自己设置此应用的定位服务。
同时,在应用程序中需要根据配置对requestAlwaysAuthorization或locationServicesEnabled方法进行请求。由于本人机器已经更新到最新的iOS8.1下面的内容主要针对iOS8,使用iOS7的朋友需要稍作调整。
还有网络的相关设置
*/
/**
设置地图的时候 一定要在plist文件里面去设置属性:NSLocationAlwaysUsageDescription 、NSLocationWhenInUseUsageDescription
以及网络属性的设置
*/
//定位管理器
1.首先导入头文件
#import <CoreLocation/CoreLocation.h>//定位
CLLocationManager *_locationManager;//定位管理器
<CLLocationManagerDelegate>
- (void)positionOfMap
{
//定位管理器
_locationManager=[[CLLocationManager alloc]init];
//+ (BOOL)locationServicesEnabled 是否启用定位服务,通常如果用户没有启用定位服务可以提示用户打开定位服务
if (![CLLocationManager locationServicesEnabled]) {
NSLog(@"定位服务当前可能尚未打开,请设置打开!");
return;
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
[_locationManager requestWhenInUseAuthorization]; //调用了这句,就会弹出允许框了.
}
/*
+ (CLAuthorizationStatus)authorizationStatus;
定位服务授权状态,返回枚举类型:
kCLAuthorizationStatusNotDetermined: 用户尚未做出决定是否启用定位服务
kCLAuthorizationStatusRestricted: 没有获得用户授权使用定位服务,可能用户没有自己禁止访问授权
kCLAuthorizationStatusDenied :用户已经明确禁止应用使用定位服务或者当前系统定位服务处于关闭状态
kCLAuthorizationStatusAuthorizedAlways: 应用获得授权可以一直使用定位服务,即使应用不在使用状态
kCLAuthorizationStatusAuthorizedWhenInUse: 使用此应用过程中允许访问定位服务
*/
//如果没有授权则请求用户授权
if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined){
[_locationManager requestWhenInUseAuthorization];
}else if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse){
//设置代理
_locationManager.delegate=self;
//设置定位精度
_locationManager.desiredAccuracy=kCLLocationAccuracyBest;
//定位频率,每隔多少米定位一次
CLLocationDistance distance=10.0;//十米定位一次
_locationManager.distanceFilter=distance;
//启动跟踪定位
[_locationManager startUpdatingLocation];//开始定位追踪,开始定位后将按照用户设置的更新频率执行
}
}
#pragma mark - CoreLocation 代理
#pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定位到相应位置)
//可以通过模拟器设置一个虚拟位置,否则在模拟器中无法调用此方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *location=[locations firstObject];//取出第一个位置
CLLocationCoordinate2D coordinate=location.coordinate;//位置坐标
NSLog(@"经度:%f,纬度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);
//如果不需要实时定位,使用完即使关闭定位服务
[_locationManager stopUpdatingLocation];//停止定位追踪
}