iOS 接入高德獵鷹軌跡功能的教程

寫這篇文章的初衷是因為剛開始做獵鷹軌跡功能的時候,除了高德本身相關的API可參考,其他基本很少有相關的教程,也入了一些坑。所以為了方便iOS開發(fā)者接入獵鷹軌跡功能,這里寫一篇相關的教程。

iOS 獵鷹SDK
獵鷹軌跡服務地址

概述:高德獵鷹功能是一套軌跡管理服務,提供移動端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,對應相關的報錯信息查看錯誤。

如有問題請在下方留言討論??!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容