示例中心
功能在线体验
menu 导航 closed 关闭

高德 开发 iOS 猎鹰SDK 开发指南 轨迹上报 开始轨迹上报

更新时间:2018年09月17日

第 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 {
            //开始采集失败
        }
    }


新用户
福利
示例
中心
常见
问题