开始轨迹上报 最后更新时间: 2021年01月22日
第 1 步,引入头文件
在调用猎鹰功能的类中引入AMapFoundationKit.h和AMapTrackKit.h这两个头文件:
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapTrackKit/AMapTrackKit.h>
第 2 步,配置key
在调用猎鹰服务时,需要添加Key,需要注意的是请在 SDK 任何类的初始化以及方法调用之前设置正确的 Key。
[AMapServices sharedServices].apiKey =@"您的key";
第 3 步,更改info.plist
在info.plist的字段添加定位权限的申请,配置方式请参考手动部署部分说明。
第 4 步,配置后台定位
依次执行:
a)左侧目录中选中工程名,开启 TARGETS->Capabilities->Background Modes
b)在 Background Modes中勾选 Location updates,如下图所示:
第 5 步,初始化猎鹰SDK
初始化需要提供一个服务(service id)来创建一个 AMapTrackManager 对象,然后设置其代理。
服务(service id)的创建请参考猎鹰rest api接口,猎鹰sdk不提供创建服务方法。
代码如下:
AMapTrackManagerOptions *option = [[AMapTrackManagerOptions alloc] init];
option.serviceID = @""; //Service ID 需要根据需要进行修改
//初始化AMapTrackManager
self.trackManager = [[AMapTrackManager alloc] initWithOptions:option];
self.trackManager.delegate = self;
第 6 步,配置猎鹰SDK
a.配置定位属性
[self.trackManager setAllowsBackgroundLocationUpdates:YES];
[self.trackManager setPausesLocationUpdatesAutomatically:NO];
b.配置定位采集周期和上报周期
猎鹰sdk默认的定位信息采集周期是2s,默认的上报周期是20s,也就是最快2s记录一次当前位置信息(若位置没有变化,这次位置信息会被忽略),20s上报一次记录下的这些信息。
可以使用 AMapTrackManager 的下面方法修改该配置:
/**
* @brief 设定定位信息的采集周期和上传周期,注意:上传周期必须为采集周期的整数倍
* @param gatherTimeInterval 定位信息的采集周期,单位秒,有效值范围[1, 60]
* @param packTimeInterval 定位信息的上传周期,单位秒,有效值范围[5, 3000]
*/
- (void)changeGatherAndPackTimeInterval:(NSInteger)gatherTimeInterval packTimeInterval:(NSInteger)packTimeInterval;
下面的代码将定位信息采集周期设置为5s,上报周期设置为30s:
[self.trackManager changeGatherAndPackTimeInterval:5 packTimeInterval:30];
c.配置本地缓存大小
猎鹰sdk会在无法正常上报轨迹点时将未成功上报的轨迹点缓存在本地,默认最多缓存50MB数据。
[self.trackManager setLocalCacheMaxSize:50];
第 7 步,获取终端(terminal id)
在启动轨迹上报服务(service id)时,需要提供终端(terminal id)信息,然后调用 startServiceWithOptions: 方法。
每个终端(terminal id)都对应您的业务中一个唯一的实体,在该终端第一次启动轨迹上报服务前,应该首先使用一个唯一标识该终端的名称创建该终端,获取终端id;若该终端(terminal id)不是第一次启动轨迹上报服务,则可以直接使用终端名称查询对应终端id。
下面的代码首先查询当前终端是否已经创建过,若没有则创建,然后使用终端id启动轨迹上报和定位采集服务。
//查询终端是否存在
AMapTrackQueryTerminalRequest *request = [[AMapTrackQueryTerminalRequest alloc] init];
request.serviceID = self.trackManager.serviceID;
request.terminalName = @"您要查询的终端名称";
[self.trackManager AMapTrackQueryTerminal:request];
//查询终端结果
- (void)onQueryTerminalDone:(AMapTrackQueryTerminalRequest *)request response:(AMapTrackQueryTerminalResponse *)response
{
//查询成功
if ([[response terminals] count] > 0) {
//查询到结果,使用 Terminal ID
NSString *terminalID = [[[response terminals] firstObject] tid];
//启动上报服务(service id),参考下一步
}
else {
//查询结果为空,创建新的terminal
AMapTrackAddTerminalRequest *addRequest = [[AMapTrackAddTerminalRequest alloc] init];
addRequest.serviceID = self.trackManager.serviceID;
addRequest.terminalName = @"您要创建的终端名称";
[self.trackManager AMapTrackAddTerminal:addRequest];
}
}
//创建终端结果
- (void)onAddTerminalDone:(AMapTrackAddTerminalRequest *)request response:(AMapTrackAddTerminalResponse *)response {
//创建terminal成功
NSString *terminalID = [response terminalID];
//启动上报服务(service id),参考下一步
}
//错误回调
- (void)didFailWithError:(NSError *)error associatedRequest:(id)request {
if ([request isKindOfClass:[AMapTrackQueryTerminalRequest class]]) {
//查询参数错误
}
if ([request isKindOfClass:[AMapTrackAddTerminalRequest class]]) {
//创建terminal失败
}
}
//查询终端是否存在
AMapTrackQueryTerminalRequest *request = [[AMapTrackQueryTerminalRequest alloc] init];
request.serviceID = self.trackManager.serviceID;
request.terminalName = @"您要查询的终端名称";
[self.trackManager AMapTrackQueryTerminal:request];
//查询终端结果
- (void)onQueryTerminalDone:(AMapTrackQueryTerminalRequest *)request response:(AMapTrackQueryTerminalResponse *)response
{
//查询成功
if ([[response terminals] count] > 0) {
//查询到结果,使用 Terminal ID
NSString *terminalID = [[[response terminals] firstObject] tid];
//启动上报服务(service id),参考下一步
}
else {
//查询结果为空,创建新的terminal
AMapTrackAddTerminalRequest *addRequest = [[AMapTrackAddTerminalRequest alloc] init];
addRequest.serviceID = self.trackManager.serviceID;
addRequest.terminalName = @"您要创建的终端名称";
[self.trackManager AMapTrackAddTerminal:addRequest];
}
}
//创建终端结果
- (void)onAddTerminalDone:(AMapTrackAddTerminalRequest *)request response:(AMapTrackAddTerminalResponse *)response {
//创建terminal成功
NSString *terminalID = [response terminalID];
//启动上报服务(service id),参考下一步
}
//错误回调
- (void)didFailWithError:(NSError *)error associatedRequest:(id)request {
if ([request isKindOfClass:[AMapTrackQueryTerminalRequest class]]) {
//查询参数错误
}
if ([request isKindOfClass:[AMapTrackAddTerminalRequest class]]) {
//创建terminal失败
}
}
第 8 步,启动上报服务(service id)
要开启定位采集,需要首先启动轨迹上报服务(service id),等服务启动成功后才能开启定位采集,下面的回调在轨迹上报服务启动成功后立即开启了轨迹采集:
//开始服务
AMapTrackManagerServiceOption *serviceOption = [[AMapTrackManagerServiceOption alloc] init];
serviceOption.terminalID = @"";//Terminal ID 需要根据需要进行修改
[self.trackManager startServiceWithOptions:serviceOption];
//service 开启结果回调
- (void)onStartService:(AMapTrackErrorCode)errorCode {
if (errorCode == AMapTrackErrorOK) {
//开始服务成功,继续开启收集上报
[self.trackManager startGatherAndPack];
} else {
//开始服务失败
}
}
//gather 开启结果回调
- (void)onStartGatherAndPack:(AMapTrackErrorCode)errorCode {
if (errorCode == AMapTrackErrorOK) {
//开始采集成功
} else {
//开始采集失败
}
}