项目背景介绍 项目需求 :使用定位功能,获取当前用户所在的地区 打算使用的定位框架 : 高德定位 平台 : iOS && Android
image.png
手把手使用步骤简介(cocopods版本):
1.创建pod文件,添加pod 'AMapLocation'
,执行podinstall
pod install.png
2.申请高德appKey
申请高德Key.png
3.打开私有权限-定位权限
info.plist - 定位权限
4.代码模块
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//使用自己申请的定位apiKey替换
[AMapServices sharedServices].apiKey = @"f84c62976e2e415b86c70dbd95793f4e";
return YES;
}
- (void)viewDidLoad
{
self.view.backgroundColor = [UIColor orangeColor];
_locationManager = [[AMapLocationManager alloc]init];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyThreeKilometers];
// 定位超时时间,最低2s,此处设置为10s
_locationManager.locationTimeout =10;
// 逆地理请求超时时间,最低2s,此处设置为10s
_locationManager.reGeocodeTimeout = 10;
// 带逆地理(返回坐标和地址信息)。将下面代码中的 YES 改成 NO ,则不会返回地址信息。
[_locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
if (error)
{
//定位失败
NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
if (error.code == AMapLocationErrorLocateFailed)
{
return;
}
}
NSLog(@"location:%@", location);
if (regeocode)
{
//定位成功-打印详细信息
NSLog(@"reGeocode:%@", regeocode);
}
}];
}
CLLocationAccuracy - 定位选择 // 最准确的定位,浪费时间最长 kCLLocationAccuracyBest // 比较准确的定位(10米误差) kCLLocationAccuracyNearestTenMeters // 相对准确的定位(100米误差) kCLLocationAccuracyHundredMeters; // 相对准确的定位(1千米误差) kCLLocationAccuracyKilometer; // 最不准确的定位(3千米误差) kCLLocationAccuracyThreeKilometers; 根据自己的需求选择定位类型,越精准的,越耗时
效果演示:
定位成功演示.png
@property (nonatomic, strong) AMapLocationManager *locationManager;
,然后用成员变量 _locationManager
进行定位操作- (void)viewDidLoad
{
self.view.backgroundColor = [UIColor orangeColor];
//这里不用_locationManager,不声明locationManager属性,new一个新的AMapLocationManager
AMapLocationManager *locationManager = [AMapLocationManager manager];
[locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
if (error)
{
NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
if (error.code == AMapLocationErrorLocateFailed)
{
return;
}
}
NSLog(@"location:%@", location);
if (regeocode)
{
NSLog(@"reGeocode:%@", regeocode);
}
}];
}
没有声明属性的AMapLocationManager
思路:
UIviewController分类.h部分代码
分类.m文件警告
手动声明locationManager属性.png
分类方法调用失败.png
解决办法
static void *managerKey = &managerKey;
-(void)setLocationManager:(AMapLocationManager *)locationManager{
objc_setAssociatedObject(self, managerKey, locationManager, OBJC_ASSOCIATION_RETAIN);
}
-(AMapLocationManager *)locationManager{
return objc_getAssociatedObject(self, managerKey);
}
image.png
image.png
//启动定位 - 并赋值
- (void)startLocationSetModel:(GaodeModel *)model LocationBlock:(LocationBlock)locationBlock;
image.png
总结:
AMapLocationManager+MNExt.h
自定义快速创建 locationManager的方法- (void)startLocationSetModel:(GaodeModel *)model LocationBlock:(LocationBlock)locationBlock
中实现需求