定位用到<CoreLocation/CoreLocation.h>
和CLLocationManagerDelegate
本篇只是做简单的定位测试
#import "AppDelegate.h"
#import <CoreLocation/CoreLocation.h>
@interface AppDelegate ()<CLLocationManagerDelegate>
{
CLLocationManager *_locationManager;//用于定位获取用户信息
CLLocation *_location;//用于保存位置信息
}
/** 纬度 */
@property (nonatomic, assign) double latitude;
/** 经度 */
@property (nonatomic, assign) double longitude;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self setUpLocationInfomation];
return YES;
}
- (void)setUpLocationInfomation
{
_locationManager = [[CLLocationManager alloc]init];
if ([CLLocationManager locationServicesEnabled]) {
NSLog(@"--------------开始定位---------------");
// distanceFilter是距离过滤器,为了减少对定位装置的轮询次数,位置的改变不会每次都去通知委托,而是在移动了足够的距离时才通知委托程序
// 它的单位是米,这里设置为至少移动200再通知委托处理更新;
_locationManager.delegate = self;
_locationManager.distanceFilter = 200.0;
// kCLLocationAccuracyBest:设备使用电池供电时候最高的精度
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
//ios8+以上要授权,并且在plist文件中添加NSLocationWhenInUseUsageDescription,NSLocationAlwaysUsageDescription,值可以为空
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
//ios8+,不加这个则不会弹框
[_locationManager requestWhenInUseAuthorization];//使用中授权
[_locationManager requestAlwaysAuthorization];
}
[_locationManager startUpdatingLocation];
}else{
NSLog(@"--------------定位失败---------------");
}
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
//此处locations存储了持续更新的位置坐标值,取最后一个值为最新位置,如果不想让其持续更新位置,则在此方法中获取到一个值之后让locationManager stopUpdatingLocation
if (_latitude) {
// 这里我测试了获取经度后stop,发现并不能有效停止,也许是因为速度较慢再次update了,若理解有误望指正
[_locationManager stopUpdatingLocation];
}else{
NSLog(@"didUpdateLocations ++++++++++ ");
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
该属性下可以填写弹窗信息,下图为效果: