上一回簡單的介紹了一下 google map 的 SDK 的簡單使用,但是光地圖的顯示實在是不夠用,顯示位置是地圖的基礎,但是導航卻是地圖的核心,相信很多人會遇到地圖定位跟導航的問題。那么這回我們就來簡單講一下導航:
手機上的導航方式,分應用內(nèi)導航和應用外導航:
應用內(nèi)導航
是指使用地圖服務提供的SDK(比如高德,百度等等),直接將導航功能嵌入到我們自己的APP內(nèi)部
但是這個方案我個人不喜歡,一是接入要一定的時間,二是增加APP的內(nèi)存占用。最最最最最最關鍵的問題是難,難,難!!!
應用外導航
是以URI跳轉(zhuǎn)的方式(在iOS中就是以URL Scheme的方式),直接跳到對應的地圖APP中,直接利用對方的功能來導航。
這樣的優(yōu)點,一是接入方便,二是不增加自己APP的開銷;缺點就是如果用戶沒有裝這個地圖應用就沒辦法使用這個地圖的服務。但是,可能你會說萬一他一個地圖的APP都沒有裝怎么辦?那不就實現(xiàn)不了了?
要相信蘋果不會讓你失望的,蘋果有個自帶的高德地圖,刪也刪不掉!這流氓,這時候還是管點用的。所以不用慌,就算他自己一個地圖類的APP都不裝,那也有蘋果自帶的,所以肯定至少會有一個,也就是說這個跳轉(zhuǎn)是能實現(xiàn)的。
首先我們來看一下究竟是什么效果,你也可以自己下一個攜程旅游的APP(申明不是打廣告,因為是上回某個雷鋒告訴我的,攜程用的就是 google map),然后隨便選個酒店,點擊地圖,然后右上角導航,就是下面這效果:
當然,如果沒有安裝某個地圖APP,那么對應的選項是不會出現(xiàn)的。彈出來的這個AlertView大家自己去實現(xiàn),這里我就不多說了。檢測APP是否安裝,只要調(diào)用下面這個方法就可以了:
比如你如果要檢測是否有安裝百度地圖APP,那么就是:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]];
如果在這里寫完代碼運行的時候打印了一行錯誤給你,那么看本文最后面,會有解決方法。
常用的4個地圖的 URL Scheme:
1.蘋果自帶地圖(不需要檢測,所以不需要URL Scheme)
2.百度地圖 :baidumap://
3.高德地圖 :iosamap://
4.谷歌地圖 :comgooglemaps://
首先我們要開啟定位功能,能定位到用戶的位置,這點相信大家都能實現(xiàn),就不多說了。然后假設我們有一個終點的位置坐標:
CLLocationCoordinate2D loc = CLLocationCoordinate2DMake([self.model.latitude floatValue], [self.model.longitude floatValue]);
然后我們來實現(xiàn)跳轉(zhuǎn):
第一:蘋果自帶地圖
蘋果提供了另一種方式:MKMapItem(要使用記得導入#import <MapKit/MapKit.h>
頭文件)
代碼如下:
CLLocationCoordinate2D loc = CLLocationCoordinate2DMake([self.model.latitude floatValue], [self.model.longitude floatValue]);
MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation];
MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:loc addressDictionary:nil]];
[MKMapItem openMapsWithItems:@[currentLocation, toLocation]
launchOptions:@{MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsShowsTrafficKey: [NSNumber numberWithBool:YES]}];
運行效果如下,綠色大頭針是起點位置,紅色大頭針是終點位置:
第二:百度地圖
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name=目的地&mode=driving&coord_type=gcj02",coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
這里面要注意幾點:
1,origin={{我的位置}}, 這個是不能被修改的,不然無法把出發(fā)位置設置為當前位置
2,destination = latlng:%f,%f|name = 目的地
這里面的 name 的字段不能省略,否則導航會失敗,而后面的文字則可以隨意,賦個你的目的地的值給他就可以了。
3,coord_type = gcj02
coord_type 允許的值為 bd09ll、gcj02、wgs84,如果你 APP 的地圖 SDK 用的是百度地圖 SDK,請?zhí)?bd09ll,否則就填gcj02,wgs84的話基本是用不上了(需要涉及到地圖加密,有興趣的同學可以自己去了解)
效果如下:
最后兩種因為自己手機沒裝,沒試驗過,在網(wǎng)上找了下代碼,也貼出來,需要用到的同學可以試一下,步驟都是一樣的。
高德地圖:
NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%f&lon=%f&dev=0&style=2",appName,urlScheme,coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
要注意幾點:
- sourceApplication=%@&backScheme=%@
sourceApplication代表你自己APP的名稱 會在之后跳回的時候顯示出來 所以必須填寫 backScheme是你APP的URL Scheme 不填是跳不回來的喲 - dev=0
這里填0就行了,跟上面的gcj02一個意思 1代表wgs84 也用不上
谷歌地圖:
NSString *urlString = [[NSString stringWithFormat:@"comgooglemaps://?x-source=%@&x-success=%@&saddr=&daddr=%f,%f&directionsmode=driving",appName,urlScheme,coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
要注意幾點
- x-source=%@&x-success=%@
跟高德一樣 這里分別代表APP的名稱和URL Scheme - saddr=
這里留空則表示從當前位置觸發(fā)。
OK,運行一下,你會發(fā)現(xiàn),沒有跳轉(zhuǎn),而且還給你打印一串錯誤!
瞬間覺得被作者坑了,莫慌。在 iOS 9 之后我們做跳轉(zhuǎn)是需要有個白名單的,就像我們做分享的時候也是一樣。
添加白名單:
在 info.plist 文件里面,添加一個字段:LSApplicationQueriesSchemes,類型為數(shù)組,然后在這個數(shù)組里面再添加我們所需要的地圖 URL Scheme :
comgooglemaps
iosamap
comgooglemaps
效果如下:
OK,再也不用擔心坑爹的老板要我做導航了,你看別人家這么牛逼的都是做的跳轉(zhuǎn)的!簡單輕松完成工作,而且用戶還能自己選擇自己喜歡的地圖。