寫這篇文章的初衷是因為剛開始做獵鷹軌跡功能的時候,除了高德本身相關的API可參考,其他基本很少有相關的教程,也入了一些坑。所以為了方便iOS開發(fā)者接入獵鷹軌跡功能,這里寫一篇相關的教程。
概述:高德獵鷹功能是一套軌跡管理服務,提供移動端SDK(iOS和安卓)和后端API供開發(fā)者接入。獵鷹可以滿足您追蹤車輛等定位設備,其提供的豐富接口和云端服務,可以讓開發(fā)者基于獵鷹迅速構建一套完全屬于自己的精準、高效 的軌跡管理系統,應用于車隊管理、人員管理等領域。"
關于如何接入軌跡sdk以及相關的配置這里就不講了, 獵鷹SDK文檔上都有介紹,唯一需要注意的是我們使用的key是iOS平臺,是根據BundleID生成的,而不是創(chuàng)建web服務生成的key,web服務生成的key是后臺人員用的。
在開始前先了解幾個概念:
獵鷹軌跡服務:service (獵鷹軌跡服務。一個service對應一個軌跡管理系統,通過一個service可管理多個終端設備(即terminal),service的唯一標識符是sid。舉例說明,針對某網約車公司的軌跡管理系統,可以創(chuàng)建一個service,在創(chuàng)建的service中管理所有營運車輛的軌跡)
服務id:service id(服務端開啟service后,會返回serviceid,這個serviceid就相當于你應用的標識,例如你使用高德sdk,需要綁定你的包名,高德會創(chuàng)建你應用唯一的key)
終端id:terminal id(在啟動軌跡上報服務(service id)時,需要提供terminal id信息,每個terminal id都對應您的業(yè)務中一個唯一的實體,相當于每個用戶或車輛的唯一標識,一般是不會改變的)
軌跡id:track id (軌跡采集成功后,要將人員或車輛的軌跡點上報到指定的軌跡id上)
下面開始上代碼:
第一步:開始軌跡服務(開始前要先查詢是否存在終端id,如果有直接使用,沒有則創(chuàng)建)
#pragma mark - Actions
//開始軌跡服務
-(void)startTrackServer{
//開始服務
AMapTrackManagerServiceOption *serviceOption = [[AMapTrackManagerServiceOption alloc] init];
serviceOption.terminalID = self.termiID;
[self.trackManager startServiceWithOptions:serviceOption];
}
第二步:創(chuàng)建終端ID
1: 創(chuàng)建之前要先查詢終端id是否存在,查詢和創(chuàng)建都要使用服務端返回給你的服務id(serviceID), 再根據終端名稱(我這里用的是userid來進行查詢和創(chuàng)建),如果存在則不創(chuàng)建,直接通過終端id開啟軌跡服務。
2:如果查詢后終端id不存在,則要進行創(chuàng)建,創(chuàng)建成功后再開啟軌跡服務
//創(chuàng)建終端ID
-(void)createTerminalID{
//Service ID 根據需要進行修改
AMapTrackManagerOptions *option = [[AMapTrackManagerOptions alloc] init];
option.serviceID = [UserModel getUserInfo].serverID;
//初始化AMapTrackManager
self.trackManager = [[AMapTrackManager alloc] initWithOptions:option];
//將定位信息采集周期設置為10s,上報周期設置為30s(這個根據實際需要自行設置)
[self.trackManager changeGatherAndPackTimeInterval:10 packTimeInterval:30];
self.trackManager.delegate = self;
//配置定位屬性
[self.trackManager setAllowsBackgroundLocationUpdates:YES];
[self.trackManager setPausesLocationUpdatesAutomatically:NO];
//查詢終端是否存在
AMapTrackQueryTerminalRequest *request = [[AMapTrackQueryTerminalRequest alloc] init];
request.serviceID = self.trackManager.serviceID;
request.terminalName = [UserModel getUserInfo].userId; //根據userID創(chuàng)建終端id
[self.trackManager AMapTrackQueryTerminal:request];
}
//查詢終端結果
- (void)onQueryTerminalDone:(AMapTrackQueryTerminalRequest *)request response:(AMapTrackQueryTerminalResponse *)response
{
//查詢成功
if ([[response terminals] count] > 0) {
//查詢到結果,使用 Terminal ID
NSString *terminalID = [[[response terminals] firstObject] tid];
NSLog(@"terminalID == %@",terminalID);
self.termiID = terminalID;
//啟動軌跡上報服務
[self startTrackServer];
}
else {
//查詢結果為空,創(chuàng)建新的terminal
AMapTrackAddTerminalRequest *addRequest = [[AMapTrackAddTerminalRequest alloc] init];
addRequest.serviceID = self.trackManager.serviceID;
addRequest.terminalName = [UserModel getUserInfo].userId; //根據userID創(chuàng)建終端id;
[self.trackManager AMapTrackAddTerminal:addRequest];
}
}
//創(chuàng)建終端結果
- (void)onAddTerminalDone:(AMapTrackAddTerminalRequest *)request response:(AMapTrackAddTerminalResponse *)response {
//創(chuàng)建terminal成功
NSString *terminalID = [response terminalID];
NSLog(@"終端id == %@",terminalID);
self.termiID = terminalID;
//啟動軌跡上報服務
[self startTrackServer];
}
- (void)onStartService:(AMapTrackErrorCode)errorCode {
if (errorCode == AMapTrackErrorOK) {
//開始服務成功
NSLog(@"開始軌跡服務成功");
//服務成功后,開始軌跡采集
[self startTrackGather];
} else {
//開始服務失敗
NSLog(@"開始軌跡服務失敗");
NSLog(@"onStartService:%ld", (long)errorCode);
}
}
第三步:軌跡上報服務成功后,創(chuàng)建軌跡id (因為后臺要根據軌跡id查詢具體人員的軌跡,所以要創(chuàng)建軌跡id)
//創(chuàng)建軌跡ID
- (void)doCreateTrackName {
if (self.trackManager == nil) {
return;
}
NSLog(@"創(chuàng)建軌跡ID");
AMapTrackAddTrackRequest *request = [[AMapTrackAddTrackRequest alloc] init];
request.serviceID = self.trackManager.serviceID;
request.terminalID = self.trackManager.terminalID;
[self.trackManager AMapTrackAddTrack:request];
}
//生成軌跡ID
- (void)onAddTrackDone:(AMapTrackAddTrackRequest *)request response:(AMapTrackAddTrackResponse *)response
{
NSLog(@"onAddTrackDone%@", response.formattedDescription);
if (response.code == AMapTrackErrorOK) {
//創(chuàng)建trackID成功,開始采集
self.trackManager.trackID = response.trackID;
NSLog(@"軌跡ID == %@",response.trackID);
//在巡檢過程中殺死應用后,需要重啟上報服務,但軌跡id被清空,不能繼續(xù)開始軌跡采集,所以需要本地存儲,巡檢結束后刪除
[KKUserDefault setObject:response.trackID forKey:@"trackID"];
[KKUserDefault synchronize];
//開始采集軌跡
[self.trackManager startGatherAndPack];
if (self.isUplodTrack) {
//上傳軌跡
//這里軌跡已經開始采集成功,請求后臺接口上傳相關的數據
}
}else {
//創(chuàng)建trackID失敗
NSLog(@"創(chuàng)建trackID失敗");
}
}
第四步:生成軌跡id后,開始軌跡采集
//開始軌跡采集
-(void)startTrackGather{
if (![KKUserDefault objectForKey:@"trackID"]) {
//軌跡id不存在,創(chuàng)建軌跡id
[self doCreateTrackName];
}else{
//軌跡id已存在,直接開始采集
NSLog(@"軌跡id已存在,直接開始采集 == %@",[KKUserDefault objectForKey:@"trackID"]);
self.trackManager.trackID = [KKUserDefault objectForKey:@"trackID"];
[self.trackManager startGatherAndPack];
if (self.isUplodTrack) {
//上傳軌跡
//這里軌跡已經開始采集成功,請求后臺接口上傳相關的數據
}
}
}
- (void)onStartGatherAndPack:(AMapTrackErrorCode)errorCode {
if (errorCode == AMapTrackErrorOK) {
//開始采集成功
NSLog(@"開始軌跡采集成功");
} else {
//開始采集失敗
NSLog(@"開始軌跡采集失敗");
NSLog(@"onStartGatherAndPack:%ld", (long)errorCode);
}
}
第五步:結束巡檢后,關閉軌跡服務 (先關閉軌跡采集,再關閉服務)
-(void)stopTrackServer{
//關閉軌跡采集
[self.trackManager stopGaterAndPack];
//關閉軌跡服務
[self.trackManager stopService];
self.trackManager.delegate = nil;
self.trackManager = nil;
//刪除軌跡id
[KKUserDefault removeObjectForKey:@"trackID"];
[KKUserDefault synchronize];
}
- (void)onStopService:(AMapTrackErrorCode)errorCode {
if (errorCode == AMapTrackErrorOK) {
NSLog(@"成功關閉軌跡服務");
}else{
NSLog(@"關閉軌跡服務錯誤");
}
}
注意:如果以上的有些代理方法未執(zhí)行,查看是否設置了代理,而且目前代理方法只能在控制器中實現,在view中不走代理方法....
在上面已經提到,如果在開啟服務過程中殺死應用后,服務也就掛了,所以app打開激活后,需要重啟服務,重啟服務用的軌跡id還是殺死應用之前的,否則同一條巡檢會有多個軌跡id,這樣就會出問題,這一點別忘記了....
以上就是獵鷹軌跡功能的所有步驟,注意所有的過程必須一步步進行,否則會導致各種錯誤,如果報錯,檢查報錯的code,對應相關的報錯信息查看錯誤。
如有問題請在下方留言討論??!