URI跳转⽅式地图导航的代码实践
⼿机上的导航⽅式分应⽤内导航和应⽤外导航
应⽤内导航
是指使⽤地图服务提供的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 2 3CLLocationCoordinate2D coordinate; NSString *urlScheme;
NSString *appName;
苹果地图
苹果地图可以通过openURL的⽅式打开
1 2 3NSString *urlString = [[NSString stringWithFormat:@"maps.apple/?daddr=%f,%f&saddr=slat,slng",coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
但是这种⽅式不能以当前位置为起点所以不符合我们的要求⽹上说可以⽤下⾯这种⽅式但是我没成功
1NSString *urlString = [[NSString stringWithFormat:@"maps.apple/?daddr=%f,%f&saddr=Current+Location",coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];但是苹果提供了另⼀种⽅式使⽤MKMapItem
1 2 3 4 5 6MKMapItem *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]}];
效果如下百度地图
1 2 3NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位
置}}&destination=latlng:%f,%f|name=⽬的地&mode=driving&coord_type=gcj02",coordinate.latitude, coordinate.longitude] stringByAddingPercentEsc [[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你基本是⽤不上了(关于地图加密这⾥也不多谈请⾃⾏学习)
效果如下url编码和utf8区别
⾼德地图
1 2 3NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%f&lon=%f&dev=0&style=2",appName,urlScheme,coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapes [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
要注意⼏点
1. sourceApplication=%@&backScheme=%@
sourceApplication代表你⾃⼰APP的名称会在之后跳回的时候显⽰出来所以必须填写 backScheme是你APP的URL Scheme 不填是跳不回来的哟
2. dev=0
这⾥填0就⾏了跟上⾯的gcj02⼀个意思 1代表wgs84 也⽤不上
效果如下
退出导航后会提⽰是否跳回到APP
⾕歌地图
1 2 3NSString *urlString = [[NSString stringWithFormat:@"comgooglemaps://?x-source=%@&x-success=%@&saddr=&daddr=%f,%f&directionsmode=driving",appName,urlScheme,coordinate.latitude, coordinate.longitude] stringByAddingPercentE [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
要注意⼏点
1. x-source=%@&x-success=%@
跟⾼德⼀样这⾥分别代表APP的名称和URL Scheme
2. saddr=
这⾥留空则表⽰从当前位置触发
效果如下在有多条路线的时候⾕歌地图会让你选择其中⼀条
选择之后就进⼊了导航页⾯
腾讯地图
既然提到了腾讯地图那么还是说⼀下从⽹上和可以得知⼤概调⽤的URI如下
1 2 3NSString *urlString = [[NSString stringWithFormat:@"qqmap://map/routeplan?type=drive&fromcoord=CurrentLocation&tocoord=%f,%f&coord_type=1&policy=0",coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEnc [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
但是很遗憾调⽤之后出错了⽆法导航
效果如下
补充说明
iOS9发布以后很多朋友发现openURL的⽅式都失败了这是因为iOS对openURL做了进⼀步限制
不过适配起来也很简单在plist中加⼀条名为LSApplicationQueriesSchemes的Array类型的Key 并把上述地图的scheme添加进去就⾏了如图
⼩结
⽂中的demo可以在到
相对来说⾼德地图做得更⽤⼼⼀点毕竟也是苹果的服务提供商⽽百度相对来说则差⼀点⾕歌的话不FQ还是⽤不了⽽苹果⾃带的地图则不多说了功能还是太简单了这⾥只是⽤最简单的⽅式对导航功能进⾏了调⽤各家的地图其实还有很多参数和功能没有使⽤到需要知道的同学可以在⽂章开头的⽂档链接中到详细的描述

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。