在ios8.0以上获取经纬度时,需要申请授权,否则不能定位
第一步:
在
HomeViewController.m
@interface
HomeViewController
()<
CLLocationManagerDelegate
>
{
//
定位
CLLocationManager *_locationManager; // 用于获取位置
CLLocation *_checkLocation; // 用于保存位置信息
double _latitude; // 经度
double _longitude; // 维度
CLLocationManager *_locationManager; // 用于获取位置
CLLocation *_checkLocation; // 用于保存位置信息
double _latitude; // 经度
double _longitude; // 维度
}
第二步:
//
设置定位
-(void)setupLocationManager{
_latitude = LATITUDE_DEFAULT;//设置默认的值
_longitude
=
LONGITUDE_DEFAULT
;
_locationManager = [[ CLLocationManager alloc ] init ];
if ([ CLLocationManager locationServicesEnabled ]) {
NSLog ( @" 开始定位 " );
_locationManager . delegate = self ;
// distanceFilter 是距离过滤器,为了减少对定位装置的轮询次数,位置的改变不会每次都去通知委托,而是在移动了足够的距离时才通知委托程序
// 它的单位是米,这里设置为至少移动 1000 再通知委托处理更新 ;
_locationManager . distanceFilter = 200.0 ;
// kCLLocationAccuracyBest: 设备使用电池供电时候最高的精度
_locationManager . desiredAccuracy = kCLLocationAccuracyBest ;
//ios8+ 以上要授权,并且在 plist 文件中添加 NSLocationWhenInUseUsageDescription , NSLocationAlwaysUsageDescription ,值可以为空
if ( IOS_VERSION >= 8.0 ) { //ios8+ ,不加这个则不会弹框
[ _locationManager requestWhenInUseAuthorization ]; // 使用中授权
[ _locationManager requestAlwaysAuthorization ];
}
[ _locationManager startUpdatingLocation ];
} else {
_locationManager = [[ CLLocationManager alloc ] init ];
if ([ CLLocationManager locationServicesEnabled ]) {
NSLog ( @" 开始定位 " );
_locationManager . delegate = self ;
// distanceFilter 是距离过滤器,为了减少对定位装置的轮询次数,位置的改变不会每次都去通知委托,而是在移动了足够的距离时才通知委托程序
// 它的单位是米,这里设置为至少移动 1000 再通知委托处理更新 ;
_locationManager . distanceFilter = 200.0 ;
// kCLLocationAccuracyBest: 设备使用电池供电时候最高的精度
_locationManager . desiredAccuracy = kCLLocationAccuracyBest ;
//ios8+ 以上要授权,并且在 plist 文件中添加 NSLocationWhenInUseUsageDescription , NSLocationAlwaysUsageDescription ,值可以为空
if ( IOS_VERSION >= 8.0 ) { //ios8+ ,不加这个则不会弹框
[ _locationManager requestWhenInUseAuthorization ]; // 使用中授权
[ _locationManager requestAlwaysAuthorization ];
}
[ _locationManager startUpdatingLocation ];
} else {
NSLog(@"
定位失败,请确定是否开启定位功能
"
);
}
}
第三步
#pragma mark - CLLocationManagerDelegate
//ios 6.0sdk
以上
-( void )locationManager:( CLLocationManager *)manager didUpdateLocations:( NSArray *)locations{
NSLog ( @"didUpdateToLocation+++" );
// 此处 locations 存储了持续更新的位置坐标值,取最后一个值为最新位置,如果不想让其持续更新位置,则在此方法中获取到一个值之后让 locationManager stopUpdatingLocation
CLLocation *cl = [locations lastObject ];
_latitude = cl. coordinate . latitude ;
_longitude = cl. coordinate . longitude ;
NSLog ( @" 纬度 --%f" , _latitude );
NSLog ( @" 经度 --%f" , _longitude );
}
-( void )locationManager:( CLLocationManager *)manager didFailWithError:( NSError *)error{
NSLog ( @" 定位失败 " );
-( void )locationManager:( CLLocationManager *)manager didUpdateLocations:( NSArray *)locations{
NSLog ( @"didUpdateToLocation+++" );
// 此处 locations 存储了持续更新的位置坐标值,取最后一个值为最新位置,如果不想让其持续更新位置,则在此方法中获取到一个值之后让 locationManager stopUpdatingLocation
CLLocation *cl = [locations lastObject ];
_latitude = cl. coordinate . latitude ;
_longitude = cl. coordinate . longitude ;
NSLog ( @" 纬度 --%f" , _latitude );
NSLog ( @" 经度 --%f" , _longitude );
}
-( void )locationManager:( CLLocationManager *)manager didFailWithError:( NSError *)error{
NSLog ( @" 定位失败 " );
}
这时运行程序,发现还是没有打印出经纬度信息,这是因为还需要在plist文件中添加NSLocationWhenInUseUsageDescription,NSLocationAlwaysUsageDescription,值可以为空