地图定位
说明:CLLocationManager
类的简单实用
步骤:
1、声明全局属
@property (nonatomic, strong) CLLocationManager *locationManager; // 定位管理者
2、在 `- (void)viewDidLoad 方法中` 中实例化`定位管理者对象`
请求定位授权,以下实现其一即可。
[self.locationManager requestAlwaysAuthorization]; // 始终使用定位,一般用于地图类应用
[self.locationManager requestWhenInUseAuthorization]; // 当app运行期间(前台)
配置info.plis文件,这里配置和代码对应。不要都配置。
<key>NSLocationWhenInUseUsageDescription</key>
<string>NSLocationWhenInUseUsageDescription</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>使用您当前位置才可以约妹子</string>
3、设置`定位管理者`代理为当前控制器(self)
4、遵循代理协议`CLLocationManagerDelegate`
实现代理方法`- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray<CLLocation *> *)locations`,该单例方法调用非常频繁,按需停止定位。
代码如下:
//// ViewController.m// CoreLocation-地图定位//// Created by quntion on 16/1/15.// Copyright © 2016年 quntion. All rights reserved.// #import "ViewController.h"#import/** @author quntion, 16-01-16 11:01:33 注意事项: 模拟器 记得设置 Debug->location->`custom Location` 否则,模拟器无法模拟当前位置在哪里 */ @interface ViewController () @property (nonatomic, strong) CLLocationManager *locationManager; // 定位管理者@end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 1、位置管理器 CLLocationManager *locationManager = [[CLLocationManager alloc] init]; self.locationManager = locationManager; // 2、设置`位置管理器`代理 self.locationManager.delegate = self; // 3、请求用户授权,必须配置info.plist文件, if ([UIDevice currentDevice].systemVersion.floatValue > 8.0) { // 请求使用位置定位授权 [self.locationManager requestAlwaysAuthorization]; [self.locationManager requestWhenInUseAuthorization]; /** ---定位精度(认为多少米内都是同一个点) extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0); // 导航使用,精度最高 extern const CLLocationAccuracy kCLLocationAccuracyBest; // 最高精度 extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters; // 精确到10米 extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters; // 精确到100米 extern const CLLocationAccuracy kCLLocationAccuracyKilometer; // 精确到1000米 extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers; // 精确到3000米 */ self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; // 这里可以自定义值 /** ---距离筛选器:移动多大范围,调用一次位置更新 kCLDistanceFilterNone // 设置为该值,告诉系统有任务位置距离改变都调用代理更新方法 如果设置为其他double数值,则告诉系统移动距离大于等于该值,才调用代理更新方法 对应的代理方法: `- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations` */ self.locationManager.distanceFilter = 100; // 距离变化大于100米才调用代理更新 // 启动定位 [self.locationManager startUpdatingLocation]; } else { NSLog(@"系统版本低于8.0"); }} #pragma mark - 自定义方法 - (void)compareLocationDistance { // 北京 经纬度 CLLocation *beijingLocation = [[CLLocation alloc] initWithLatitude:39 longitude:115]; // 上海 经纬度 CLLocation *shanghaiLocation = [[CLLocation alloc] initWithLatitude:30 longitude:120]; // 计算 两点 球面直线距离 CLLocationDistance detalDistance = [beijingLocation distanceFromLocation:shanghaiLocation]; NSLog(@"北京到上海的球面距离=[%lf米] [%lf公里]", detalDistance, detalDistance/1000.0);} #pragma mark - CLLocatinManager 代理 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { NSLog(@"%@", manager);} #pragma mark - touch 事件 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self compareLocationDistance];} @end