App內(nèi)根據(jù)手機上裝載的地圖App將其顯示在彈出的選擇框,選擇對應(yīng)地圖跳轉(zhuǎn)進入地圖導(dǎo)航。需要用到- (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);方法判斷手機是否已安裝相應(yīng)地圖App。
創(chuàng)新互聯(lián)公司主營吳忠網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,APP應(yīng)用開發(fā),吳忠h5微信小程序開發(fā)搭建,吳忠網(wǎng)站營銷推廣歡迎吳忠等地區(qū)企業(yè)咨詢
要進行跳轉(zhuǎn)需要先在xcode的plist文件內(nèi)將目標(biāo)App的url Scheme加入白名單(LSApplicationQueriesSchemes)。
用過微信的應(yīng)該都知道這個功能,對方發(fā)一個位置給你,點進去地圖展示對方跟你的當(dāng)前位置,界面提供了選擇各個地圖應(yīng)用進行導(dǎo)航,更好這次需求也要搞這個功能。
這個功能實現(xiàn)不難,個人感覺比應(yīng)用內(nèi)嵌入第三方地圖導(dǎo)航SDK用起來更舒服,更接地氣,逼格也高點,主要要的是簡單(畢竟人家啥都處理好了)。
上項目效果圖(還是想吐槽下傻逼的產(chǎn)品,為啥不直接照搬微信的界面,至少比自己的好看)
這里有一個重點,主要是彈出的選擇框的選項并不是固定的,而是根據(jù)你手機上有沒有安裝這個地圖應(yīng)用,沒有就不會出現(xiàn)。
這里就要用到
- (BOOL)canOpenURL:(NSURL*)urlNS_AVAILABLE_IOS(3_0);
判斷手機上有沒有安裝該地圖應(yīng)用。
所以要知道地圖應(yīng)用的url?Scheme。
這里提供了幾個常用地圖應(yīng)用的url?Scheme:
baidumap//百度地圖
iosamap//高德地圖
comgooglemaps//谷歌地圖
qqmap//騰訊地圖
….//其他地圖省略
蘋果地圖不需要,因為它是蘋果地圖啊,這樣也好,能保證沒有安裝其他地圖app,至少還有一個蘋果地圖,而且蘋果地圖在IOS9也做的越來越好了,本身API提供了一個跳轉(zhuǎn)打開方法。
這里插入一個小細節(jié),在IOS9之后,蘋果進一步完善了安全機制,必須在plist里面設(shè)置url scheme白名單,不然無法打開對應(yīng)的應(yīng)用
前方高能,重點來了!?。。?/p>
這里我抽了個方法返回支持導(dǎo)航的地圖信息數(shù)組:
這里只要傳入提供的坐標(biāo)點,就打包好了需要的信息。
什么,你說彈出?那玩意自己去寫,不想寫,自己去找,不然就用系統(tǒng)的actionSheet。
最后結(jié)尾還有個小插曲,由于我們后臺給的目標(biāo)經(jīng)緯度是百度坐標(biāo)系,項目用的也是百度地圖,界面上展示是沒啥問題了,但是由于不同的地圖有自己的坐標(biāo)系,而要用它們進行導(dǎo)航,那傳給它們的必須是標(biāo)準(zhǔn)的經(jīng)緯度坐標(biāo),這就蛋疼了,百度這坑爹只有提供了標(biāo)準(zhǔn)的轉(zhuǎn)成它自己的坐標(biāo)系,而沒有提供反轉(zhuǎn)的方法,去官網(wǎng)開發(fā)者社區(qū)發(fā)帖,也沒用,只是回答你沒有提供,所以我猜傳言百度地圖SDK是實習(xí)生寫的還是有一定的可靠性。
沒辦法,只能求爺爺告奶奶,去查找對應(yīng)的資料,還是找到一個第三方的轉(zhuǎn)換方法 ,但是仍然有一定的偏差,能接受的就接受吧。
上次我們說到在蘋果開發(fā)者官網(wǎng)查看MapKit文檔,下面直接講解如何加載MapKit的視圖及相關(guān)的屬性。
導(dǎo)入系統(tǒng)文件,創(chuàng)建MKMapView對象即可,地圖就可以加載了。
1 適用環(huán)境
移動設(shè)備瀏覽器端應(yīng)用和移動App應(yīng)用均可調(diào)起iOS版百度地圖。
2 協(xié)議形式
無論是基于移動瀏覽器端的應(yīng)用開發(fā)還是基于iOS
SDK的應(yīng)用開發(fā)均可采用如下協(xié)議調(diào)起iOS版百度地圖。該協(xié)議要正確執(zhí)行除了要參數(shù)填寫正確外,還必須要安裝iOS百度地圖。
protocol://product/[service/]action[?parameters] //parameters功能參數(shù)定義,具體規(guī)范見功能協(xié)議說明
示例:
baidumap://map/direction?origin=中關(guān)村destination=五道口mode=drivingregion=北京
//本示例是通過該URL啟動地圖app并進入北京市從中關(guān)村到五道口的駕車導(dǎo)航路線圖
組成說明:
參數(shù)名稱
參數(shù)說明
是否必選
備注
protocol
產(chǎn)品線協(xié)議頭,例如baidumap表示百度地圖
必選
product
產(chǎn)品線名稱,例如如百度地圖客戶端(map)
必選
product下可直接跟方法,當(dāng)然產(chǎn)品線也可增加一個service級別
service
具體功能服務(wù)名稱,如POI檢索服務(wù)(place)
必選
action
方法名稱,如POI檢索中的詳情檢索(detail)
必選
parameters
方法參數(shù),參考各個功能協(xié)議說明的定義
必選
3 功能使用說明
3.1 標(biāo)注
調(diào)用該接口可調(diào)起IOS百度地圖,且在指定坐標(biāo)點上顯示點的名稱和內(nèi)容信息。
服務(wù)地址
baidumap://map/marker //iOS服務(wù)地址
參數(shù)說明
參數(shù)名稱
參數(shù)說明
是否必選
備注
location
lat緯度,lng經(jīng)度
必選
title
標(biāo)注點顯示標(biāo)題
必選
product下可直接跟方法,當(dāng)然產(chǎn)品線也可增加一個service級別
content
標(biāo)注點顯示內(nèi)容
必選
coord_type
坐標(biāo)類型,可選參數(shù),默認為bd09ll。
可選
允許的值為bd09ll、gcj02、wgs84。bd09ll表示百度經(jīng)緯度坐標(biāo),
gcj02表示經(jīng)過國測局坐標(biāo),wgs84表示gps獲取的坐標(biāo)。
zoom
展現(xiàn)地圖的級別,默認為視覺最優(yōu)級別。
可選
src
調(diào)用來源,規(guī)則:companyName|appName。
必選
此參數(shù)不傳值,不保證服務(wù)。
代碼片段
//網(wǎng)頁應(yīng)用調(diào)起iOS百度地圖方式舉例
a href="baidumap://map/marker?location=40.047669,116.313082title=我的位置content=百度奎科大廈src
=yourCompanyName|yourAppName"地圖標(biāo)點/a
(void)longPress:(UIGestureRecognizer*)gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan){ //這個狀態(tài)判斷很重要
//坐標(biāo)轉(zhuǎn)換
CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView];
CLLocationCoordinate2D touchMapCoordinate =
[self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];
//這里的touchMapCoordinate.latitude和touchMapCoordinate.longitude就是想要的經(jīng)緯度,
NSLog(@"%f",touchMapCoordinate.latitude);
NSLog(@"%f",touchMapCoordinate.longitude);
//30.264998 120.122538 30.285012 120.117989
LocationObject *aLocationObject = [[LocationObject alloc]initWithTitle:@"hello" latitue:touchMapCoordinate.latitude longitude:touchMapCoordinate.longitude];
aLocationObject._subTitleString = @"world";
NSMutableArray *_mapAnnotations = [[NSMutableArray alloc]initWithCapacity:1];
[_mapAnnotations addObject:aLocationObject];
[self.mapView addAnnotations:_mapAnnotations ];
[_mapAnnotations release];
[aLocationObject release];
}
}
解決的辦法:A頁面生成一個mapView,然后大家共用它,而不是每次點擊單元格都創(chuàng)建一個地圖。因為A頁面和B頁面切換速度過快,地圖繪制是很耗時間的,地圖還沒有創(chuàng)建出來就退出,有時候就會導(dǎo)致內(nèi)存泄露--crash。