示例中心
功能在线体验
控制台
您现在的位置: 开发 > iOS 定位SDK > 开发指南 > 获取位置 > 后台定位 >

高德 开发 iOS 定位SDK 开发指南 获取位置 后台定位

更新时间:2017年11月29日

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 步,更改info.plist

在info.plist的字段添加定位权限的申请,配置方式请参考手动部署部分说明。

第 4 步,配置后台定位

依次执行:

a)左侧目录中选中工程名,开启 TARGETS->Capabilities->Background Modes

b)在 Background Modes中勾选 Location updates,如下图所示:

第 5 步,初始化定位

初始化AMapLocationManager对象,设置代理。代码如下:

- (void)viewDidLoad
{
    self.locationManager = [[AMapLocationManager alloc] init];
    self.locationManager.delegate = self;
}
override func viewDidLoad() {
    // 注意: locationManager为该类的属性
    locationManager = AMapLocationManager()
    locationManager.delegate = self
}

设置定位最小更新距离方法如下,单位米。当两次定位距离满足设置的最小更新距离时,SDK会返回符合要求的定位结果。

self.locationManager.distanceFilter = 200;
locationManager.distanceFilter = 200

设置后台定位开启地址描述返回:

注意:在海外地区是没有地址描述返回的,地址描述只在中国国内返回。

/**
 *  后台定位是否返回逆地理信息,默认NO。
 */
@property (nonatomic, assign) BOOL locatingWithReGeocode;

第 6 步,开启持续定位

调用AMapLocationManager提供的startUpdatingLocation方法实现。

代码如下:

//iOS 9(不包含iOS 9) 之前设置允许后台定位参数,保持不会被系统挂起
[self.locationManager setPausesLocationUpdatesAutomatically:NO];

//iOS 9(包含iOS 9)之后新特性:将允许出现这种场景,同一app中多个locationmanager:一些只能在前台定位,另一些可在后台定位,并可随时禁止其后台定位。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    self.locationManager.allowsBackgroundLocationUpdates = YES;
}
//开始持续定位
[self.locationManager startUpdatingLocation];
//iOS 9(不包含iOS 9) 之前设置允许后台定位参数,保持不会被系统挂起
locationManager.pausesLocationUpdatesAutomatically = false

//iOS 9(包含iOS 9)之后新特性:将允许出现这种场景,同一app中多个locationmanager:一些只能在前台定位,另一些可在后台定位,并可随时禁止其后台定位。
if UIDevice.current.systemVersion._bridgeToObjectiveC().doubleValue >= 9.0 {
    locationManager.pausesLocationUpdatesAutomatically = true
}

//开始持续定位
locationManager.startUpdatingLocation()

如果需要持续定位返回逆地理编码信息,(自 V2.2.0版本起支持)需要做如下设置:

[self.locationManager setLocatingWithReGeocode:YES];
[self.locationManager startUpdatingLocation];
locationManager.locatingWithReGeocode = true
locationManager.startUpdatingLocation()

第 7 步,接收定位结果

在回调函数中,获取定位坐标,进行业务处理。

- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode
{
    NSLog(@"location:{lat:%f; lon:%f; accuracy:%f}", location.coordinate.latitude, location.coordinate.longitude, location.horizontalAccuracy);
    if (regeocode)
      {
          NSLog(@"reGeocode:%@", regeocode);
      }
}
func amapLocationManager(_ manager: AMapLocationManager!, didUpdate location: CLLocation!, reGeocode: AMapLocationReGeocode?) {
    NSLog("location:{lat:\(location.coordinate.latitude); lon:\(location.coordinate.longitude); accuracy:\(location.horizontalAccuracy);};");
    
    if let reGeocode = reGeocode {
        NSLog("reGeocode:%@", reGeocode)
    }
}
示例中心 功能
在线体验
常见问题