成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

URI跳轉方式地圖導航的代碼實踐

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

[[145108]]

前言

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

手機上的導航方式 分應用內導航和應用外導航

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

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

而今天要說的 就是第二種 因為網上說的都不是很全面 所以今天把對這種方式的研究結果總結一下

 

研究

先來看一下我們要達到什么效果 就是當我們點導航的時候 會彈出下面這個選擇列表

當然 如果沒有安裝某個地圖APP 那么對應的選項是不會出現的 檢測APP是否安裝 只要調用下面這個方法就可以了

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

 

關于APP的URL Scheme相關內容這里就不介紹了 大家可以自行去研究

那么我們上圖提到了4個地圖應用 分別是

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

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

下面來對比一下幾種地圖

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

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

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

假設我們有一個指定的目的坐標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]]; 

但是這種方式 不能以當前位置為起點 所以不符合我們的要求 網上說可以用下面這種方式 但是我沒成功

  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]]; 

要注意幾點

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

效果如下

#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]]; 

要注意幾點

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

效果如下

退出導航后 會提示是否跳回到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]]; 

要注意幾點

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

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

選擇之后就進入了導航頁面

騰訊地圖

既然提到了騰訊地圖 那么還是說一下 從網上和官方文檔可以得知 大概調用的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]]; 

但是很遺憾 調用之后出錯了 無法導航

效果如下

小結

文中的demo可以在這里找到

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

這里只是用最簡單的方式對導航功能進行了調用 各家的地圖其實還有很多參數和功能沒有使用到 需要知道的同學可以在文章開頭的文檔鏈接中找到詳細的描述

責任編輯:倪明 來源: 里脊串的開發隨筆
相關推薦

2014-12-30 11:26:00

地圖

2010-08-05 09:39:17

Flex頁面跳轉

2012-03-14 10:13:39

諾基亞地圖導航

2023-07-07 12:26:39

攜程開發

2010-08-25 08:58:32

HTML

2010-08-13 13:25:53

Flex頁面跳轉

2014-12-22 16:14:22

高德地圖

2011-09-26 10:05:19

百度地圖API

2014-11-13 10:46:30

高德地圖APEC出行

2014-10-29 17:53:00

高德地圖

2009-12-02 19:08:19

PHP跳轉代碼

2011-09-16 14:39:02

百度地圖API

2011-10-24 14:01:29

API

2020-08-20 11:14:19

高德地圖AR駕車新版本

2012-11-27 10:19:22

手機地圖導航應用導航犬

2023-04-28 08:06:04

低代碼AI智能

2015-07-23 10:09:45

后臺定位代碼

2020-03-09 14:10:48

代碼開發工具

2014-10-29 13:52:38

程序員

2015-07-27 09:39:24

后臺代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩午夜在线观看 | 日韩第一页 | 九九热国产精品视频 | 久草视频观看 | 在线精品国产 | 久久免费大片 | 精品一区二区三区免费视频 | 一级午夜aaa免费看三区 | 久久久久久久99 | 亚洲激情在线观看 | 免费1区2区3区 | 一级毛片免费 | 午夜噜噜噜 | 成人av网站在线观看 | 日韩中文字幕在线视频 | 爱草视频 | 综合激情av | 欧美日韩一区精品 | 天天干天天玩天天操 | 国产精品日韩欧美一区二区三区 | 新超碰97| 色综合久久88色综合天天 | 国产一区二区三区 | 欧美一级片 | 7777奇米影视 | 婷婷一级片 | 性做久久久久久免费观看欧美 | 一区在线播放 | 99r在线 | 欧美一区二区三区 | 亚洲男人网| 日韩欧美理论片 | 欧美日韩高清在线一区 | 99久久精品国产一区二区三区 | 亚洲国产网址 | 美女啪啪国产 | 美女视频黄色的 | 激情六月丁香 | 国产福利在线 | 日韩欧美国产精品一区二区三区 | 欧美在线一区二区三区 |