轨迹追踪

简介

鹰眼iOS SDK可根据开发者设置的定位和回传频率,自动采集并回传轨迹。

开发者通过在APP中调用startTrace()和stopTrace()方法,来控制何时开始轨迹采集、何时停止轨迹采集。

轨迹追踪

实现最简单的轨迹追踪功能,请参见Hello Trace部分示例。

重要:若需实现轨迹采集,operationMode必须设置为2,否则将无法实现轨迹采集。 开始追踪和结束追踪的状态码信息请见BaiduTraceSDK-Swift.h文件中的BTRACEOnStartTraceType和BTRACEOnStopTraceType的定义。

轨迹采集周期和打包周期

概念:

定位周期:多久定位一次,在定位周期大于15s时,SDK会将定位周期设置为5的倍数(如设置采集周期为18s,SDK会调整为15s;设置为33s,SDK会调整为30s)


回传周期:鹰眼为节省电量和流量,并不是定位一次就回传一次数据,而是隔段时间将一批定位数据打包压缩回传。每个打包周期最多会打包50条轨迹数据。目前SDK的最低采集周期为2秒,最大打包周期为60秒,也就是正常情况下,每个打包周期到来的时候,可以把本周期内所有采集到的轨迹数据都上传至服务端。


1. 设置固定的定位和回传周期:


鹰眼SDK支持开发者在startTrace前通过调用BTRACE类的setInterval方法设置固定的定位周期和回传周期,Objective-C示例:

//setInterval代表采集周期,packInterval代表打包上传周期
BOOL intervalSetRet = [traceInstance setInterval:2 packInterval:10];

2. 在轨迹追踪时动态设置定位和回传周期:

startTrace之后,可通过调用BTRACEAction类的changeGatherAndPackIntervalsAfterStartTrace方法动态调整定位和回传周期。例如,在高速运动时高频定位,低速运动时低频定位。鹰眼SDK目前不会自动地根据运动状态来调整定位和打包频率,需要开发者根据自身业务需求来动态调整,Objective-C示例:

//gatherInterval代表采集周期,packInterval代表打包上传周期
[[BTRACEAction shared] changeGatherAndPackIntervalsAfterStartTrace:self gatherInterval:5 packInterval:10];

注:定位和回传频率约高,流量和电量消耗越大。

轨迹点属性数据上传

轨迹中的每个位置点可拥有一系列开发者自定义的描述字段,比如开发一款跑步类的APP,需要记录每个轨迹点所对应的心率和体温信息。开发者可以调用ApplicationServiceDelegate协议中的trackAttr()方法,将心率和体温数据“附加”到每个轨迹点上。

开发者须重写ApplicationServiceDelegate中的trackAttr()接口,并按照设置的定位周期更新心率信息。 鹰眼SDK会在每个定位周期回调trackAttr()方法,读取该方法字典类型返回值,作为当前轨迹点的自定义字段的值。示例:


(NSDictionary*)trackAttr {
 
//创建一个字典类型的对象customData,用于存储自定义属性值,可存多个key,value对
NSMutableDictionary *customData = [NSMutableDictionary dictionary];
 
//创建两个字符串类型的变量,用于存储当前最新的心率和体温值(不论属性字段类型是什么,一律转成字符串类型传入,之后鹰眼会根据不同自定义字段的类型进行转换)
NSString* valueOfHeartrate = <开发者自定义的获取当前心率的方法>;
NSString* valueOfTemprature = <开发者自定义的获取当前体温的方法>;
 
//为字典类型的对象赋值
[customData setObject: valueOfHeartrate forKey: @"heartrate"];
[customData setObject: valueOfTemprature forKey: @"temperature"];
 
//返回customData
return customData;
}

其中,heart_rate和temperature是开发者通过鹰眼webapi的 track/addcolumn接口 添加的两个track属性字段。


完成轨迹点属性信息上传后,开发者在调用queryEntityList()方法和getTrackHistory方法查询轨迹数据时,这些心率和体温数据会作为轨迹的“附加”数据呈现出来。

复杂网络状态下,SDK的连接与轨迹回传策略

在网络状态持续良好的情况下,SDK将按照指定频率回传轨迹。如果在开启轨迹追踪时、追踪过程中、或结束轨迹追踪时遇到网络不稳定或断网的情况,SDK也有相应处理策略:


①开启追踪追踪,调用startTrace()时

只要调用startTrace(),不论网络状态和startTrace()回调的状态码是什么,SDK都将立即开始采集并缓存轨迹,若此时网络连接正常,将实时回传轨迹;若连上不可上网的Wi-Fi或网络断开,则将缓存轨迹在手机数据库中,同时开启网络自动监听以及主动重试(每隔5个打包周期重试一次),待联网时自动回传缓存数据(处于缓存状态时,因为轨迹在设备端,实时位置、历史轨迹和里程都不能获取到最新的轨迹信息)。


②轨迹追踪过程中

若追踪过程中,出现网络中断、连上不可上网的Wi-Fi,或网络频繁切换时,SDK都将自动开启缓存模式,将采集的轨迹数据保存到数据库中,并自动监听网络,待联网时自动回传缓存数据。


③停止轨迹追踪,调用stopTrace()时

只要调用stopTrace(),无论网络状态和返回值如何,SDK都将立即停止轨迹采集。

若此时网络连接正常,SDK将加快上传已缓存的轨迹,上传成功后在回调用返回停止服务成功;

若此时连上不能上网的Wi-Fi,SDK将一直重试,直至连接成功后在回调用返回停止服务成功;若一直无法连接成功,将一直无回调;

若此时已断网或回传过程中断网,将立即停止回传,缓存数据存储至手机数据库中,返回停止服务成功,再次startTrace时才会继续回传缓存数据。