iOS調(diào)用第三方地圖路線導(dǎo)航

做的項(xiàng)目里面有見面功能? 所以就需要有導(dǎo)航? 導(dǎo)航兩種實(shí)現(xiàn)方式 (集成第三方SDKURL跳轉(zhuǎn)第三方應(yīng)用)? 項(xiàng)目要求實(shí)現(xiàn)直接跳轉(zhuǎn) 所以接下來做的是實(shí)現(xiàn)URL跳轉(zhuǎn)第三方地圖來導(dǎo)航了

實(shí)現(xiàn)如下的效果


項(xiàng)目中實(shí)現(xiàn)彈窗讓用戶輸入目的地? 實(shí)現(xiàn)導(dǎo)航使雙方見面

思路:把輸入的目的地地理編碼? 獲取到的經(jīng)緯度再調(diào)用第三方的導(dǎo)航

實(shí)現(xiàn)中遇到的坑:首先地理編碼得到的地標(biāo)會不止一個 (這個可以把所有的地標(biāo)信息展示出來? 讓用戶來選擇是哪一個 可是沒有地圖出現(xiàn)直接這樣展示有點(diǎn)詭異 所以我放棄了這種)

其次遇到的坑:從地標(biāo)中拿到了經(jīng)緯度 這樣得到的是地球坐標(biāo)(也就是GPS使用的是WGS84的坐標(biāo)系統(tǒng)? 但在我國 出于國家安全考慮 國內(nèi)所有導(dǎo)航電子地圖必須使用國家測繪局制定的加密坐標(biāo)系統(tǒng) 即將一個真實(shí)的經(jīng)緯度坐標(biāo)加密成一個不正確的經(jīng)緯度坐標(biāo) 即火星坐標(biāo)) 當(dāng)然這樣也可以實(shí)現(xiàn)? 只是要考慮到每種地圖的坐標(biāo)系都不同? 這樣做就是得每種都計(jì)算 所以也放棄了

接下來說一下我的實(shí)現(xiàn)

實(shí)現(xiàn)跳轉(zhuǎn)首先想到的肯定是配置URL Scheme 和白名單了

百度地圖 URL Scheme: baidumap:// ? ? ? ? ? ? ? ?文檔鏈接

高德地圖 URL Scheme:? iosamap:// ? ? ? ? ? ? ? ? ?文檔鏈接

谷歌地圖 URL Scheme:comgooglemaps:// ? ? ?文檔鏈接

騰訊地圖 URL Scheme:qqmap:// ? ? ? ? ? ? ? ? ? ? ? ?文檔鏈接

配置好白名單之后就要敲代碼了? 如果沒有安裝某個地圖App? 那么對應(yīng)的選項(xiàng)就不應(yīng)該出現(xiàn)? 檢測App是否安裝? 只需要調(diào)用下面的方法即可

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]

我所做的是讓用戶輸入目的地 調(diào)用第三方地圖應(yīng)用的路線接口 直接把目的地傳進(jìn)去 用戶可以選擇導(dǎo)航 因?yàn)槲覀兊膽?yīng)用做的是附近人的見面 所以我選擇的出行方式是walk 但是騰訊地圖用這種方式是實(shí)現(xiàn)不了的 蘋果自帶的地圖也實(shí)現(xiàn)不了 需要傳經(jīng)緯度

通過位置調(diào)用地理編碼 為蘋果地圖和騰訊地圖的實(shí)現(xiàn)傳入經(jīng)緯度

///? 地理編碼- (void)geocoderClick:(NSString *)addressString{

// 創(chuàng)建

Geocoder? ? CLGeocoder *geocoder = [CLGeocoder new];

// 調(diào)用方法

[geocoder geocodeAddressString:addressString completionHandler:^(NSArray* _Nullable placemarks, NSError * _Nullable error) {

if (placemarks.count == 0 || error) {

[MATools showServerResultInView:self.view withText:@"您輸入的地址有誤上炎,請重新輸入" andImage:nil];

return;

}

CLPlacemark *pm = [placemarks lastObject];

CLLocationCoordinate2D gps = CLLocationCoordinate2DMake(pm.location.coordinate.latitude, pm.location.coordinate.longitude);

self.maps = [self getInstalledMapAppWithAddr:addressString withEndLocation:gps];

[self alertAmaps:gps];

}];

}

下面是我封裝的方法獲取手機(jī)上所安裝了的地圖

#pragma mark - 路線規(guī)劃方法

- (NSArray *)getInstalledMapAppWithAddr:(NSString *)addrString withEndLocation:(CLLocationCoordinate2D)endLocation

{

NSMutableArray *maps = [NSMutableArray array];

//蘋果地圖

NSMutableDictionary *iosMapDic = [NSMutableDictionary dictionary];

iosMapDic[@"title"] = @"蘋果地圖";

[maps addObject:iosMapDic];

NSString *appStr = NSLocalizedString(@"app_name", nil);

//高德地圖

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {

NSMutableDictionary *gaodeMapDic = [NSMutableDictionary dictionary];

gaodeMapDic[@"title"] = @"高德地圖";

NSString *urlString = [[NSString stringWithFormat:@"iosamap://path?sourceApplication=%@&sid=BGVIS1&did=BGVIS2&dname=%@&dev=0&t=2",appStr ,addrString] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet? URLQueryAllowedCharacterSet]];

gaodeMapDic[@"url"] = urlString;

[maps addObject:gaodeMapDic];

}

//百度地圖

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]]) {

NSMutableDictionary *baiduMapDic = [NSMutableDictionary dictionary];

baiduMapDic[@"title"] = @"百度地圖";

NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin=我的位置&destination=%@&mode=walking&src=%@",addrString ,appStr] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet? URLQueryAllowedCharacterSet]];

baiduMapDic[@"url"] = urlString;

[maps addObject:baiduMapDic];

}

//騰訊地圖

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"qqmap://"]]) {

NSMutableDictionary *qqMapDic = [NSMutableDictionary dictionary];

qqMapDic[@"title"] = @"騰訊地圖";

NSString *urlString = [[NSString stringWithFormat:@"qqmap://map/routeplan?from=我的位置&type=walk&tocoord=%f,%f&to=%@&coord_type=1&policy=0",endLocation.latitude , endLocation.longitude ,addrString] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet? URLQueryAllowedCharacterSet]];

qqMapDic[@"url"] = urlString;

[maps addObject:qqMapDic];

}

//谷歌地圖

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"comgooglemaps://"]]) {

NSMutableDictionary *googleMapDic = [NSMutableDictionary dictionary];

googleMapDic[@"title"] = @"谷歌地圖";

NSString *urlString = [[NSString stringWithFormat:@"comgooglemaps://?saddr=&daddr=%@&directionsmode=walking",addrString] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet? URLQueryAllowedCharacterSet]];

googleMapDic[@"url"] = urlString;

[maps addObject:googleMapDic];

}

return maps;

}

彈窗提示用戶所能打開的第三方地圖應(yīng)用

- (void)alertAmaps:(CLLocationCoordinate2D)gps

{

if (self.maps.count == 0) {

return;

}

UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];

for (int i = 0; i < self.maps.count; i++) {

if (i == 0) {

[alertVC addAction:[UIAlertAction actionWithTitle:self.maps[i][@"title"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

[self navAppleMap:gps];

}]];

}else{

[alertVC addAction:[UIAlertAction actionWithTitle:self.maps[i][@"title"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

[self otherMap:i];

}]];

}

}

[alertVC addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];

[self presentViewController:alertVC animated:YES completion:nil];

}

蘋果地圖實(shí)現(xiàn)導(dǎo)航的方法 需要導(dǎo)入頭文件#import<CoreLocation/CoreLocation.h> #import<MapKit/MapKit.h>

// 蘋果地圖

- (void)navAppleMap:(CLLocationCoordinate2D)gps

{

MKMapItem *currentLoc = [MKMapItem mapItemForCurrentLocation];

MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:gps addressDictionary:nil]];

NSArray *items = @[currentLoc,toLocation];

NSDictionary *dic = @{

MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeWalking,

MKLaunchOptionsMapTypeKey: @(MKMapTypeStandard),

MKLaunchOptionsShowsTrafficKey: @(YES)

};

[MKMapItem openMapsWithItems:items launchOptions:dic];

}

通過url打開第三方地圖應(yīng)用

///? 第三方地圖

- (void)otherMap:(NSInteger)index

{

NSDictionary *dic = self.maps[index];

NSString *urlString = dic[@"url"];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兽埃,一起剝皮案震驚了整個濱河市料皇,隨后出現(xiàn)的幾起案子月洛,更是在濱河造成了極大的恐慌日麸,老刑警劉巖杭煎,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異背率,居然都是意外死亡话瞧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門寝姿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來交排,“玉大人,你說我怎么就攤上這事饵筑“Bǎ” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵根资,是天一觀的道長架专。 經(jīng)常有香客問我,道長玄帕,這世上最難降的妖魔是什么部脚? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮桨仿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘案狠。我一直安慰自己服傍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布骂铁。 她就那樣靜靜地躺著吹零,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拉庵。 梳的紋絲不亂的頭發(fā)上灿椅,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音钞支,去河邊找鬼茫蛹。 笑死,一個胖子當(dāng)著我的面吹牛烁挟,可吹牛的內(nèi)容都是我干的婴洼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撼嗓,長吁一口氣:“原來是場噩夢啊……” “哼柬采!你這毒婦竟也來了欢唾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤粉捻,失蹤者是張志新(化名)和其女友劉穎礁遣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肩刃,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祟霍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了树酪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浅碾。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖续语,靈堂內(nèi)的尸體忽然破棺而出垂谢,到底是詐尸還是另有隱情,我是刑警寧澤疮茄,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布滥朱,位于F島的核電站,受9級特大地震影響力试,放射性物質(zhì)發(fā)生泄漏徙邻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一畸裳、第九天 我趴在偏房一處隱蔽的房頂上張望缰犁。 院中可真熱鬧,春花似錦怖糊、人聲如沸帅容。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽并徘。三九已至,卻和暖如春扰魂,著一層夾襖步出監(jiān)牢的瞬間麦乞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工劝评, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姐直,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓蒋畜,卻偏偏與公主長得像简肴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子百侧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容