开发 iOS 定位SDK 开发指南 获取位置 单次定位

单次定位 最后更新时间: 2021年01月22日

iOS定位SDK提供的单次定位方法基于苹果定位核心,苹果定位核心会在设备移动时连续返回定位结果,高德在此基础上封装了单次定位。当设备可以正常联网时,还可以返回该定位点的对应的中国境内位置信息(包括:省、市、区/县以及详细地址)。

第 1 步,引入头文件

在调用定位功能的类中引入AMapFoundationKit.h和AMapLocationKit.h这两个头文件,注意Swift需要在桥接文件中引入头文件:

#import <AMapFoundationKit/AMapFoundationKit.h>

#import <AMapLocationKit/AMapLocationKit.h>
//在桥接文件中引入头文件
#import <AMapFoundationKit/AMapFoundationKit.h>

#import <AMapLocationKit/AMapLocationKit.h>

第 2 步,配置Key

在调用定位时,需要添加Key,需要注意的是请在 SDK 任何类的初始化以及方法调用之前设置正确的 Key。

如果您使用的是定位SDK v2.x版本需要引入基础 SDK AMapLocationKit.framework ,设置apiKey的方式如下:

iOS 定位SDK v2.x版本设置 Key:

[AMapServices sharedServices].apiKey =@"您的key";
AMapServices.shared().apiKey = "您的key"

如果您使用的是定位SDK v1.x版本,请您尽快更新。

iOS 定位SDK v1.x版本设置 Key:

[AMapLocationServices sharedServices].apiKey =@"您的key";
AMapLocationServices.shared().apiKey = "您的key"

第 3 步,设置期望定位精度

由于苹果系统的首次定位结果为粗定位,其可能无法满足需要高精度定位的场景。

所以,高德提供了 kCLLocationAccuracyBest 参数,设置该参数可以获取到精度在10m左右的定位结果,但是相应的需要付出比较长的时间(10s左右),越高的精度需要持续定位时间越长。

推荐:kCLLocationAccuracyHundredMeters,一次还不错的定位,偏差在百米左右,超时时间设置在2s-3s左右即可。


// 带逆地理信息的一次定位(返回坐标和地址信息)
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
//   定位超时时间,最低2s,此处设置为2s
self.locationManager.locationTimeout =2;
//   逆地理请求超时时间,最低2s,此处设置为2s
self.locationManager.reGeocodeTimeout = 2;
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters

locationManager.locationTimeout = 2

locationManager.reGeocodeTimeout = 2

高精度:kCLLocationAccuracyBest,可以获取精度很高的一次定位,偏差在十米左右,超时时间请设置到10s,如果到达10s时没有获取到足够精度的定位结果,会回调当前精度最高的结果。

// 带逆地理信息的一次定位(返回坐标和地址信息)
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
//   定位超时时间,最低2s,此处设置为10s
self.locationManager.locationTimeout =10;
//   逆地理请求超时时间,最低2s,此处设置为10s
self.locationManager.reGeocodeTimeout = 10;
locationManager.desiredAccuracy = kCLLocationAccuracyBest

locationManager.locationTimeout = 10

locationManager.reGeocodeTimeout = 10

其余精度阈值您可以通过查看参考手册得到。

第 4 步,请求定位并拿到结果

调用 AMapLocationManager 的 requestLocationWithReGeocode:completionBlock: 方法,请求一次定位。

您可以选择在一次定位时是否返回地址信息(需要联网)。以下是请求带逆地理信息的一次定位,代码如下:

// 带逆地理(返回坐标和地址信息)。将下面代码中的 YES 改成 NO ,则不会返回地址信息。
[self.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);
        }
    }];
locationManager.requestLocation(withReGeocode: false, completionBlock: { [weak self] (location: CLLocation?, reGeocode: AMapLocationReGeocode?, error: Error?) in
            
    if let error = error {
        let error = error as NSError
        
        if error.code == AMapLocationErrorCode.locateFailed.rawValue {
            //定位错误:此时location和regeocode没有返回值,不进行annotation的添加
            NSLog("定位错误:{\(error.code) - \(error.localizedDescription)};")
            return
        }
        else if error.code == AMapLocationErrorCode.reGeocodeFailed.rawValue
            || error.code == AMapLocationErrorCode.timeOut.rawValue
            || error.code == AMapLocationErrorCode.cannotFindHost.rawValue
            || error.code == AMapLocationErrorCode.badURL.rawValue
            || error.code == AMapLocationErrorCode.notConnectedToInternet.rawValue
            || error.code == AMapLocationErrorCode.cannotConnectToHost.rawValue {
            
            //逆地理错误:在带逆地理的单次定位中,逆地理过程可能发生错误,此时location有返回值,regeocode无返回值,进行annotation的添加
            NSLog("逆地理错误:{\(error.code) - \(error.localizedDescription)};")
        }
        else {
            //没有错误:location有返回值,regeocode是否有返回值取决于是否进行逆地理操作,进行annotation的添加
        }
    }
    
    if let location = location {
        NSLog("location:%@", location)
    }
    
    if let reGeocode = reGeocode {
        NSLog("reGeocode:%@", reGeocode)
    }
})
返回顶部 示例中心 常见问题 智能客服 公众号
二维码