iOS實現(xiàn)應用內(nèi)打開第三方地圖app進行導航

好久沒寫文章了询一,是該好好總結(jié)下,先把我CSDN上有用的文章先搬過來撐撐門面是晨!
我的CSDN主頁肚菠,懶,所有沒幾個文章
這篇文章地址

用過微信的應該都知道這個功能罩缴,對方發(fā)一個位置給你蚊逢,點進去地圖展示對方跟你的當前位置,界面提供了選擇各個地圖應用進行導航箫章,更好這次需求也要搞這個功能烙荷。

這個功能實現(xiàn)不難,個人感覺比應用內(nèi)嵌入第三方地圖導航SDK用起來更舒服檬寂,更接地氣终抽,逼格也高點,主要要的是簡單(畢竟人家啥都處理好了)桶至。

上項目效果圖(還是想吐槽下傻逼的產(chǎn)品昼伴,為啥不直接照搬微信的界面,至少比自己的好看

這里有一個重點塞茅,主要是彈出的選擇框的選項并不是固定的亩码,而是根據(jù)你手機上有沒有安裝這個地圖應用,沒有就不會出現(xiàn)野瘦。

這里就要用到
- (BOOL)canOpenURL:(NSURL*)url NS_AVAILABLE_IOS(3_0);
判斷手機上有沒有安裝該地圖應用描沟。

所以要知道地圖應用的url Scheme飒泻。
這里提供了幾個常用地圖應用的url Scheme:

baidumap//百度地圖
iosamap//高德地圖
comgooglemaps//谷歌地圖
qqmap//騰訊地圖
…//其他地圖省略

蘋果地圖不需要,因為它是蘋果地圖啊吏廉,這樣也好泞遗,能保證沒有安裝其他地圖app,至少還有一個蘋果地圖席覆,而且蘋果地圖在IOS9也做的越來越好了史辙,本身API提供了一個跳轉(zhuǎn)打開方法。

這里插入一個小細節(jié)佩伤,在IOS9之后聊倔,蘋果進一步完善了安全機制,必須在plist里面設置url scheme白名單生巡,不然無法打開對應的應用


前方高能耙蔑,重點來了!9氯佟5槟啊!
這里我抽了個方法返回支持導航的地圖信息數(shù)組:

#pragma mark - 導航方法  
- (NSArray *)getInstalledMapAppWithEndLocation:(CLLocationCoordinate2D)endLocation  
{  
    NSMutableArray *maps = [NSMutableArray array];  
    //蘋果地圖  
    NSMutableDictionary *iosMapDic = [NSMutableDictionary dictionary];  
    iosMapDic[@"title"] = @"蘋果地圖";  
    [maps addObject:iosMapDic];  
    //百度地圖  
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]]) {  
        NSMutableDictionary *baiduMapDic = [NSMutableDictionary dictionary];  
        baiduMapDic[@"title"] = @"百度地圖";  
        NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name=北京&mode=driving&coord_type=gcj02",endLocation.latitude,endLocation.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
        baiduMapDic[@"url"] = urlString;  
        [maps addObject:baiduMapDic];  
    }  
    //高德地圖  
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {  
        NSMutableDictionary *gaodeMapDic = [NSMutableDictionary dictionary];  
        gaodeMapDic[@"title"] = @"高德地圖";  
        NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%f&lon=%f&dev=0&style=2",@"導航功能",@"nav123456",endLocation.latitude,endLocation.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
        gaodeMapDic[@"url"] = urlString;  
        [maps addObject:gaodeMapDic];  
    }  
    //谷歌地圖  
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"comgooglemaps://"]]) {  
        NSMutableDictionary *googleMapDic = [NSMutableDictionary dictionary];  
        googleMapDic[@"title"] = @"谷歌地圖";  
        NSString *urlString = [[NSString stringWithFormat:@"comgooglemaps://?x-source=%@&x-success=%@&saddr=&daddr=%f,%f&directionsmode=driving",@"導航測試",@"nav123456",endLocation.latitude, endLocation.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
        googleMapDic[@"url"] = urlString;  
        [maps addObject:googleMapDic];  
    }  
    //騰訊地圖  
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"qqmap://"]]) {  
        NSMutableDictionary *qqMapDic = [NSMutableDictionary dictionary];  
        qqMapDic[@"title"] = @"騰訊地圖";  
        NSString *urlString = [[NSString stringWithFormat:@"qqmap://map/routeplan?from=我的位置&type=drive&tocoord=%f,%f&to=終點&coord_type=1&policy=0",endLocation.latitude, endLocation.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
        qqMapDic[@"url"] = urlString;  
        [maps addObject:qqMapDic];  
    }  
    return maps;  
}  

這里只要傳入提供的坐標點盐股,就打包好了需要的信息钱豁。

什么,你說彈出疯汁?那玩意自己去寫牲尺,不想寫,自己去找涛目,不然就用系統(tǒng)的actionSheet秸谢。

#pragma mark LCActionSheetDelegate  
-(void)actionSheet:(LCActionSheet *)actionSheet didClickedButtonAtIndex:(NSInteger)buttonIndex  
{  
    if (buttonIndex != -1) {  
        if (buttonIndex == 0) {  
            [self navAppleMap];  
            return;  
        }  
        NSDictionary *dic = self.maps[buttonIndex];  
        NSString *urlString = dic[@"url"];  
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];  
    }  
}  
//蘋果地圖  
- (void)navAppleMap  
{  
    CLLocationCoordinate2D gps = [JZLocationConverter bd09ToWgs84:self.destinationCoordinate2D];  
    MKMapItem *currentLoc = [MKMapItem mapItemForCurrentLocation];  
    MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:gps addressDictionary:nil]];  
    NSArray *items = @[currentLoc,toLocation];  
    NSDictionary *dic = @{  
                          MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,  
                          MKLaunchOptionsMapTypeKey : @(MKMapTypeStandard),  
                          MKLaunchOptionsShowsTrafficKey : @(YES)  
                          };  
    [MKMapItem openMapsWithItems:items launchOptions:dic];  
}  

最后結(jié)尾還有個小插曲,由于我們后臺給的目標經(jīng)緯度是百度坐標系霹肝,項目用的也是百度地圖估蹄,界面上展示是沒啥問題了,但是由于不同的地圖有自己的坐標系沫换,而要用它們進行導航臭蚁,那傳給它們的必須是標準的經(jīng)緯度坐標,這就蛋疼了讯赏,百度這坑爹只有提供了標準的轉(zhuǎn)成它自己的坐標系垮兑,而沒有提供反轉(zhuǎn)的方法,去官網(wǎng)開發(fā)者社區(qū)發(fā)帖漱挎,也沒用系枪,只是回答你沒有提供,所以我猜傳言百度地圖SDK是實習生寫的還是有一定的可靠性磕谅。

沒辦法私爷,只能求爺爺告奶奶雾棺,去查找對應的資料,還是找到一個第三方的轉(zhuǎn)換方法https://github.com/JackZhouCn/JZLocationConverter衬浑,但是仍然有一定的偏差捌浩,能接受的就接受吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末工秩,一起剝皮案震驚了整個濱河市尸饺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌助币,老刑警劉巖浪听,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奠支,居然都是意外死亡馋辈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門倍谜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叉抡,你說我怎么就攤上這事尔崔。” “怎么了褥民?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵季春,是天一觀的道長。 經(jīng)常有香客問我消返,道長载弄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任撵颊,我火速辦了婚禮宇攻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倡勇。我一直安慰自己逞刷,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布妻熊。 她就那樣靜靜地躺著夸浅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扔役。 梳的紋絲不亂的頭發(fā)上帆喇,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音亿胸,去河邊找鬼坯钦。 笑死预皇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的葫笼。 我是一名探鬼主播深啤,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼路星!你這毒婦竟也來了溯街?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤洋丐,失蹤者是張志新(化名)和其女友劉穎呈昔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體友绝,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡堤尾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迁客。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郭宝。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掷漱,靈堂內(nèi)的尸體忽然破棺而出粘室,到底是詐尸還是另有隱情,我是刑警寧澤卜范,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布衔统,位于F島的核電站,受9級特大地震影響海雪,放射性物質(zhì)發(fā)生泄漏锦爵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一奥裸、第九天 我趴在偏房一處隱蔽的房頂上張望险掀。 院中可真熱鬧,春花似錦刺彩、人聲如沸迷郑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗡害。三九已至,卻和暖如春畦攘,著一層夾襖步出監(jiān)牢的瞬間霸妹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工知押, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叹螟,地道東北人鹃骂。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像罢绽,于是被迫代替她去往敵國和親畏线。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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