之前介绍了我正在做的是一款定位主打的应用。然后最近我们需要做一个定位导航的功能,能够让用户从当前位置导航到指定目的地(默认以驾车的方式导航)。

手机上的导航方式,分应用内导航应用外导航:

  • 应用内导航

是指使用地图服务提供的SDK(比如高德,百度等等),直接将导航功能嵌入到我们自己的APP内部

但是这个方案我个人不喜欢,一是接入要一定的时间,二是增加APP的内存占用

  • 应用外导航

是以URI跳转的方式(在iOS中就是以URL Scheme的方式),直接跳到对应的地图APP中,直接利用对方的功能来导航。

这样的优点,一是接入方便,二是不增加自己APP的开销;缺点就是如果用户没有装这个地图应用就没办法使用这个地图的服务。

说起应用内导航,当年是被图吧坑惨了。两年前,高德和百度都没有推出导航SDK的时候,市面上好像就只有图吧有应用内导航SDK,所以不得已用了图吧SDK。如今图吧SDK仍是我心中最难用的地图SDK(话说百度的SDK和图吧的SDK设计感觉上是一脉相承的,不晓得是不是百度做地图时挖了一大批图吧的人?),而且就是这个难用的SDK,竟然还是收费的。

而今天要说的,就是第二种。因为网上说的都不是很全面,所以今天把对这种方式的研究结果总结一下。

研究

先来看一下我们要达到什么效果,就是当我们点导航的时候,会弹出下面这个选择列表。

当然,如果没有安装某个地图APP,那么对应的选项是不会出现的。检测APP是否安装,只要调用下面这个方法就可以了

[[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

CLLocationCoordinate2D coordinate;
NSString *urlScheme;
NSString *appName;

苹果地图

苹果地图可以通过openURL的方式打开。

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

但是这种方式,不能以当前位置为起点,所以不符合我们的要求。网上说可以用下面这种方式,但是我没成功

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

但是苹果提供了另一种方式,使用MKMapItem

MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation];
MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:coordinate 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={{我的位置}}

这个是不能被修改的 不然无法把出发位置设置为当前位置

2. destination=latlng:%f,%f|name=目的地

name=XXXX name这个字段不能省略 否则导航会失败 而后面的文字则可以随便填

3. coord_type=gcj02

coord_type允许的值为bd09ll、gcj02、wgs84 如果你APP的地图SDK用的是百度地图SDK 请填bd09ll 否则 就填gcj02 wgs84你基本是用不上了(关于地图加密这里也不多谈 请自行学习)

效果如下

高德地图

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

要注意几点:

1. sourceApplication=%@&backScheme=%@

sourceApplication代表你自己APP的名称 会在之后跳回的时候显示出来 所以必须填写 backScheme是你APP的URL Scheme 不填是跳不回来的哟

2. dev=0

这里填0就行了,跟上面的gcj02一个意思 1代表wgs84 也用不上

效果如下:

退出导航后,会提示是否跳回到APP

谷歌地图

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

要注意几点

1. x-source=%@&x-success=%@

跟高德一样 这里分别代表APP的名称和URL Scheme

2. saddr=

这里留空则表示从当前位置触发

效果如下。在有多条路线的时候,谷歌地图会让你选择其中一条

选择之后就进入了导航页面。

腾讯地图

既然提到了腾讯地图 那么还是说一下 从网上和官方文档可以得知 大概调用的URI如下

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];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];

但是很遗憾,调用之后出错了,无法导航

效果如下

小结

文中的demo可以在这里找到

相对来说,高德地图做得更用心一点,毕竟也是苹果的服务提供商。而百度相对来说则差一点。谷歌的话,不翻墙还是用不了。而苹果自带的地图则不多说了,功能还是太简单了。

这里只是用最简单的方式对导航功能进行了调用,各家的地图其实还有很多参数和功能没有使用到。需要知道的同学可以在文章开头的文档链接中找到详细的描述。

点击导航按钮后进入百度地图app,如果手机没有安装的话,就跳转到AppStore相关推荐

  1. 微信中调用地图导航 可唤醒高德百度地图app(vue)

    1.安装weixin-js-sdk npm i -S weixin-js-sdk 2 获取微信授权 import wx from 'weixin-js-sdk'async created() {//签 ...

  2. 微信中html调用地图导航 可唤醒高德百度地图app(vue)

    1.安装weixin-js-sdk npm i -S weixin-js-sdk 2 获取微信授权  import wx from 'weixin-js-sdk'  async created() { ...

  3. H5 如何唤起百度地图 App

    最近接手了一个需求,要求混合式开发,前端做好 h5 后将页面嵌入到 ios 和 android 中,需要用到百度地图的地图导航.具体功能点如下: 如果手机端(ios, android)安装了百度地图, ...

  4. 高德地图——浏览器定位+点击获取经纬度+去除高德百度地图左下角logo

    高德地图--浏览器定位+点击获取经纬度+去除高德百度地图左下角logo 1.代码 <!doctype html> <html> <head><meta cha ...

  5. 百度地图 app 点击事件无效、不触发 解决方案

    百度地图 app 点击事件无效.不触发 解决方案 参考文章: (1)百度地图 app 点击事件无效.不触发 解决方案 (2)https://www.cnblogs.com/muzhe/articles ...

  6. layui表格点击排序按钮后,表格绑定事件失效解决方法

    layui表格点击排序按钮后,表格绑定事件失效解决方法 参考文章: (1)layui表格点击排序按钮后,表格绑定事件失效解决方法 (2)https://www.cnblogs.com/gongliha ...

  7. html中点击提交按钮显示提交i成功,百里香叶:点击提交按钮后显示成功信息

    我有一个spring-boot申请,Thymeleaf.我有非常基本的情况.有一个表单,当用户点击提交按钮时,表单数据应发送到控制器,但在同一页面中应显示成功消息.百里香叶:点击提交按钮后显示成功信息 ...

  8. ionic开发——打开百度地图APP如何传递参数,导航路线

    首先,打开百度地图APP的方法不知道朋友可以看一下这里: <ionic开发--检测是否安装某APP,如果安装打开该APP>http://blog.csdn.net/yu1731013344 ...

  9. 百度地图显示服务器异常,地铁导航崩了,百度地图:公交服务数据升级故障,BUG已修复...

    9 月 17 日早高峰期间,不少用户在微博反映称百度地图 APP 出现异常情况,公交路线查询中无法显示地铁方案,仅显示公交车方案.当用户选择地铁优先则会显示没有该方案,请选择其他出行方案. 还有部分微 ...

最新文章

  1. spring 框架学习(一)
  2. java笔记:自己动手写javaEE
  3. Oracle包和包体以及与非包体定义函数、过程的区别
  4. 下拉框联动_058-ajax之三级联动案例分析
  5. 【Java设计模式】建造者模式、原型模式
  6. 深入浅出oracle锁原理篇
  7. win2012iis php,Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
  8. 精心总结了10个matplotlib绘图技巧,短小精悍,威力无穷!
  9. java 虚拟机 分析_Java 虚拟机中的运行时数据区分析
  10. 校园招聘数电模电笔试题
  11. 硬见小百科:PCB多层板各层含义与设计原则
  12. NK细胞治疗肿瘤相关进展概述
  13. 模拟IIC——关于模拟IIC的IO口的配置选取推挽输出还是开漏输出,以及是否需要更改IO口输入输出模式和是否需要对IO配置上拉
  14. 利用ViewPager和WheelView实现横向纵向轮番滚动
  15. 金蝶报表制作_金蝶财务软件报表制作
  16. HDU_最大报销额(DP)
  17. tomcat9下载与安装(免安装版)
  18. 96年阿里P7晒出工资单:狠补了这个,真香...
  19. 从一道笔试题谈算法优化(上)
  20. php slug,WordPress的PHP函数通过slug名称获得多个类别?

热门文章

  1. Java与SQL server连接错误及解决
  2. 群星启动器获取mod列表失败解决方法
  3. pip install MySQL-python安装失败。如何解决
  4. CSDN 第 8 期题解(无 T1 代码)
  5. ubuntu切换root用户出错:sudo:无法切换为root组ID:不允许的操作
  6. Oracle系列-简介及安装
  7. photoshop人物精修_如何使用Photoshop轻松删除照片中的人物
  8. 2022年,我们为什么要学习C++?
  9. 穿透ARP防火墙控制局域网电脑网速
  10. 黑鲨手机能不能用鸿蒙系统,黑鲨游戏手机3 Pro的操控方式曝光