第一遍集成百度導航的時候,遇到一些坑,當時懵懵懂懂的寫完了,完全沒感覺。
第二次寫的時候,還是那些坑,甚至更多了,有必要寫一篇文章總結一下。
1、集成導航的SDK
從百度地圖api官網下載或者是pod導入都可以。
集成后需要注意的事項:
1、Build Phases->Link Binary With Libraries ?展開以后,把libbaiduNaviSDK.a移動到所有sdk的最下方,一定要是最下方!
2、Info->LSApplicationQueriesSchemes中添加一個baidumap字段
Privacy - Location When In Use Usage Description ? 后面添加內容:只有開啟定位功能才能正常使用百度導航
2、申請appKey,去下載SDK的地方申請,如果項目里已經使用百度地圖,則可以和地圖共用一個key。
3、注冊百度語音
搜索百度語音以后,進入百度語音的官網,如圖
點擊右側的應用管理
點擊管理包名
如上圖:選擇iOS,并且把項目的Bundle Identifier粘貼到此處。
如果沒有做這一步,會提示TTS授權失敗。
4、在項目的AppDelegate.m中寫如下代碼
//初始化導航SDK
? ? [BNCoreServices_Instance initServices:apk];
? ? [BNCoreServices_Instance setTTSAppId:@"此處是百度語音中注冊的應用的APP ID"];
? ? [BNCoreServices_Instance startServicesAsyn:nil fail:nil];
5、開始在需要的地方加入導航代碼
- (void)naviGoAction{
? ? //節點數組
? ? NSMutableArray *nodesArray = [[NSMutableArray alloc] initWithCapacity:2];
? ? //起點
? ? BNRoutePlanNode *startNode = [[BNRoutePlanNode alloc] init];
? ? startNode.pos = [[BNPosition alloc] init];
? ? startNode.pos.x = 起點的緯度;
? ? startNode.pos.y = 起點的經度;
? ? startNode.pos.eType = BNCoordinate_BaiduMapSDK;
? ? [nodesArray addObject:startNode];
? ? //終點
? ? BNRoutePlanNode *endNode = [[BNRoutePlanNode alloc] init];
? ? endNode.pos = [[BNPosition alloc] init];
? ? endNode.pos.x = 終點的緯度;
? ? endNode.pos.y = 終點的經度;
? ? endNode.pos.eType = BNCoordinate_BaiduMapSDK;
? ? [nodesArray addObject:endNode];
? ? //發起路徑規劃
? ? [BNCoreServices_RoutePlan startNaviRoutePlan:BNRoutePlanMode_Recommend naviNodes:nodesArray time:nil delegete:self userInfo:nil];
}
#pragma mark BNNaviUIManagerDelegate 算路成功回調
-(void)routePlanDidFinished:(NSDictionary *)userInfo{
? ? NSLog(@"算路成功");
? ? //路徑規劃成功,開始導航 BN_NaviTypeSimulator 默認模擬導航,BN_NaviTypeReal 真機導航
? ? [BNCoreServices_UI showPage:BNaviUI_NormalNavi delegate:self extParams:nil];
}
//算路失敗回調
- (void)routePlanDidFailedWithError:(NSError *)error andUserInfo:(NSDictionary *)userInfo{
? ? NSLog(@"算路失敗--%@",error);
? ? switch ([error code]%10000)
? ? {
? ? ? ? case BNAVI_ROUTEPLAN_ERROR_LOCATIONFAILED:
? ? ? ? NSLog(@"暫時無法獲取您的位置,請稍后重試");
? ? ? ? break;
? ? ? ? case BNAVI_ROUTEPLAN_ERROR_ROUTEPLANFAILED:
? ? ? ? NSLog(@"無法發起導航");
? ? ? ? break;
? ? ? ? case BNAVI_ROUTEPLAN_ERROR_LOCATIONSERVICECLOSED:
? ? ? ? NSLog(@"定位服務未開啟,請到系統設置中打開定位服務。");
? ? ? ? break;
? ? ? ? case BNAVI_ROUTEPLAN_ERROR_NODESTOONEAR:
? ? ? ? NSLog(@"起終點距離起終點太近");
? ? ? ? break;
? ? ? ? default:
? ? ? ? NSLog(@"算路失敗");
? ? ? ? break;
? ? }
}
//算路取消
-(void)routePlanDidUserCanceled:(NSDictionary*)userInfo {
NSLog(@"算路取消");
}
如果用戶手機上沒有安裝百度地圖app,那么當調起百度地圖的時候,會調用如上代碼,也就是在你開發的app上進行導航。
如果用戶手機上安裝了百度地圖app,那么如果只寫入以上代碼,app會自動跳轉百度地圖app,此時百度地圖的起始和終點位置的輸入框中顯示地圖上的點,這樣給用戶不好的體驗。那么以下代碼就解決了這個問題
if ( [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]]){
? ? ? ? NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=name:%@|latlng:%f,%f&mode=driving",@“此處是目的地的名稱”,目的地緯度,目的地經度] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
? ? ? ? NSURL *url = [NSURL URLWithString:urlString];
? ? ? ? [[UIApplication sharedApplication] openURL:url];
? ? }
這樣的話,顯示的時候就是
如果不按照上面代碼里面寫,畫線的兩個地方就顯示:地圖上的點。
這種寫法參照百度地圖官網解釋。
百度地圖的集成總是會遇到很多問題,歡迎交流。