自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

URI跳轉(zhuǎn)方式地圖導(dǎo)航的代碼實(shí)踐

移動開發(fā)
之前介紹了我正在做的是一款定位主打的應(yīng)用 然后最近我們需要做一個定位導(dǎo)航的功能 能夠讓用戶從當(dāng)前位置導(dǎo)航到指定目的地(默認(rèn)以駕車的方式導(dǎo)航)手機(jī)上的導(dǎo)航方式 分應(yīng)用內(nèi)導(dǎo)航和應(yīng)用外導(dǎo)航

[[145108]]

前言

之前介紹了我正在做的是一款定位主打的應(yīng)用 然后最近我們需要做一個定位導(dǎo)航的功能 能夠讓用戶從當(dāng)前位置導(dǎo)航到指定目的地(默認(rèn)以駕車的方式導(dǎo)航)

手機(jī)上的導(dǎo)航方式 分應(yīng)用內(nèi)導(dǎo)航和應(yīng)用外導(dǎo)航

  • 應(yīng)用內(nèi)導(dǎo)航
    是指使用地圖服務(wù)提供的SDK(比如高德,百度等等) 直接將導(dǎo)航功能嵌入到我們自己的APP內(nèi)部
    但是這個方案我個人不喜歡 一是接入要一定的時間 二是增加APP的內(nèi)存占用
  • 應(yīng)用外導(dǎo)航
    是以URI跳轉(zhuǎn)的方式(在iOS中就是以URL Scheme的方式) 直接跳到對應(yīng)的地圖APP中 直接利用對方的功能來導(dǎo)航
    這樣的優(yōu)點(diǎn) 一是接入方便 二是不增加自己APP的開銷 缺點(diǎn)就是如果用戶沒有裝這個地圖應(yīng)用就沒辦法使用這個地圖的服務(wù)

說起應(yīng)用內(nèi)導(dǎo)航 當(dāng)年是被圖吧坑慘了 兩年前 高德和百度都沒有推出導(dǎo)航SDK的時候 市面上好像就只有圖吧有應(yīng)用內(nèi)導(dǎo)航SDK 所以不得已用了圖吧SDK 如今圖吧SDK仍是我心中最難用的地圖SDK(話說百度的SDK和圖吧的SDK設(shè)計感覺上是一脈相承的 不曉得是不是百度做地圖時挖了一大批圖吧的人?) 而且就是這個難用的SDK 竟然還是收費(fèi)的

而今天要說的 就是第二種 因?yàn)榫W(wǎng)上說的都不是很全面 所以今天把對這種方式的研究結(jié)果總結(jié)一下

 

研究

先來看一下我們要達(dá)到什么效果 就是當(dāng)我們點(diǎn)導(dǎo)航的時候 會彈出下面這個選擇列表

當(dāng)然 如果沒有安裝某個地圖APP 那么對應(yīng)的選項(xiàng)是不會出現(xiàn)的 檢測APP是否安裝 只要調(diào)用下面這個方法就可以了

  1. [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"appurlscheme://"

 

關(guān)于APP的URL Scheme相關(guān)內(nèi)容這里就不介紹了 大家可以自行去研究

那么我們上圖提到了4個地圖應(yīng)用 分別是

  1. 蘋果地圖
  2. 百度地圖
  3. 高德地圖
  4. 谷歌地圖

這些也是當(dāng)前我們用得最多的幾種地圖了(什么 你們說還有騰訊地圖? 可惜騰訊地圖暫時還不支持URI的方式打開 所以這里就沒列出來 等可以用了我會補(bǔ)上)

下面來對比一下幾種地圖

地圖 URL Scheme 文檔 是否可以跳回到APP
蘋果地圖   文檔                  否
百度地圖 baidumap:// 文檔                  否
高德地圖 iosamap:// 文檔                  是
谷歌地圖 comgooglemaps:// 文檔                  是

蘋果地圖是系統(tǒng)自帶的(而且蘋果地圖最好的方式也不是用URI的方式開打) 所以無需URL Scheme就可以打開的
其次 當(dāng)跳到地圖APP之后可以跳回是一種很好的體驗(yàn)(參考微信的跳轉(zhuǎn)) 但是遺憾的是 蘋果地圖和百度地圖都不支持跳回

接下來我們就回到正題 說一說每種地圖的跳轉(zhuǎn)方式

假設(shè)我們有一個指定的目的坐標(biāo)coordinate 而我們自己的APP的URL Scheme是urlScheme 名稱是appName

  1. CLLocationCoordinate2D coordinate; 
  2. NSString *urlScheme; 
  3. NSString *appName; 

蘋果地圖

蘋果地圖可以通過openURL的方式打開

 

  1. NSString *urlString = [[NSString stringWithFormat:@"http://maps.apple.com/?daddr=%f,%f&saddr=slat,slng",coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 
  2.  
  3. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; 

但是這種方式 不能以當(dāng)前位置為起點(diǎn) 所以不符合我們的要求 網(wǎng)上說可以用下面這種方式 但是我沒成功

  1. NSString *urlString = [[NSString stringWithFormat:@"http://maps.apple.com/?daddr=%f,%f&saddr=Current+Location",coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

 

但是蘋果提供了另一種方式 使用MKMapItem

 

  1. MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation]; 
  2. MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil]]; 
  3.                                               
  4. [MKMapItem openMapsWithItems:@[currentLocation, toLocation]  
  5.                launchOptions:@{MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving, 
  6.                                MKLaunchOptionsShowsTrafficKey: [NSNumber numberWithBool:YES]}]; 

效果如下

百度地圖

  1. NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name=目的地&mode=driving&coord_type=gcj02",coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
  2.                                               
  3. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; 

要注意幾點(diǎn)

  1. origin=
    這個是不能被修改的 不然無法把出發(fā)位置設(shè)置為當(dāng)前位置
  2. destination=latlng:%f,%f|name=目的地
    name=XXXX name這個字段不能省略 否則導(dǎo)航會失敗 而后面的文字則可以隨便填
  3. coord_type=gcj02
    coord_type允許的值為bd09ll、gcj02、wgs84 如果你APP的地圖SDK用的是百度地圖SDK 請?zhí)頱d09ll 否則 就填gcj02 wgs84你基本是用不上了(關(guān)于地圖加密這里也不多談 請自行學(xué)習(xí))

效果如下

#p#

高德地圖

  1. NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%f&lon=%f&dev=0&style=2",appName,urlScheme,coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
  2.  
  3. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; 

要注意幾點(diǎn)

  1. sourceApplication=%@&backScheme=%@
    sourceApplication代表你自己APP的名稱 會在之后跳回的時候顯示出來 所以必須填寫 backScheme是你APP的URL Scheme 不填是跳不回來的喲
  2. dev=0
    這里填0就行了 跟上面的gcj02一個意思 1代表wgs84 也用不上

效果如下

退出導(dǎo)航后 會提示是否跳回到APP

谷歌地圖

  1. NSString *urlString = [[NSString stringWithFormat:@"comgooglemaps://?x-source=%@&x-success=%@&saddr=&daddr=%f,%f&directionsmode=driving",appName,urlScheme,coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
  2.  
  3. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; 

要注意幾點(diǎn)

  1. x-source=%@&x-success=%@
    跟高德一樣 這里分別代表APP的名稱和URL Scheme
  2. saddr=
    這里留空則表示從當(dāng)前位置觸發(fā)

效果如下 在有多條路線的時候 谷歌地圖會讓你選擇其中一條

選擇之后就進(jìn)入了導(dǎo)航頁面

騰訊地圖

既然提到了騰訊地圖 那么還是說一下 從網(wǎng)上和官方文檔可以得知 大概調(diào)用的URI如下

  1. NSString *urlString = [[NSString stringWithFormat:@"qqmap://map/routeplan?type=drive&fromcoord=CurrentLocation&tocoord=%f,%f&coord_type=1&policy=0",coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
  2.  
  3. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; 

但是很遺憾 調(diào)用之后出錯了 無法導(dǎo)航

效果如下

小結(jié)

文中的demo可以在這里找到

相對來說 高德地圖做得更用心一點(diǎn) 畢竟也是蘋果的服務(wù)提供商 而百度相對來說則差一點(diǎn) 谷歌的話 不翻墻還是用不了 而蘋果自帶的地圖則不多說了 功能還是太簡單了

這里只是用最簡單的方式對導(dǎo)航功能進(jìn)行了調(diào)用 各家的地圖其實(shí)還有很多參數(shù)和功能沒有使用到 需要知道的同學(xué)可以在文章開頭的文檔鏈接中找到詳細(xì)的描述

責(zé)任編輯:倪明 來源: 里脊串的開發(fā)隨筆
相關(guān)推薦

2014-12-30 11:26:00

地圖

2010-08-05 09:39:17

Flex頁面跳轉(zhuǎn)

2012-03-14 10:13:39

諾基亞地圖導(dǎo)航

2023-07-07 12:26:39

攜程開發(fā)

2014-12-22 16:14:22

高德地圖

2010-08-13 13:25:53

Flex頁面跳轉(zhuǎn)

2014-11-13 10:46:30

高德地圖APEC出行

2011-09-26 10:05:19

百度地圖API

2010-08-25 08:58:32

HTML

2014-10-29 17:53:00

高德地圖

2009-12-02 19:08:19

PHP跳轉(zhuǎn)代碼

2011-10-24 14:01:29

API

2011-09-16 14:39:02

百度地圖API

2020-08-20 11:14:19

高德地圖AR駕車新版本

2012-11-27 10:19:22

手機(jī)地圖導(dǎo)航應(yīng)用導(dǎo)航犬

2016-12-07 10:02:54

移動應(yīng)用開發(fā)底部導(dǎo)航android

2017-07-21 11:28:57

前端Threejs3D地圖

2015-07-23 10:09:45

后臺定位代碼

2020-03-09 14:10:48

代碼開發(fā)工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號