当开发简单的地图功能时,我们可以使用集成地图 SDK 来开发相应的功能,但是要开发导航这种复杂的功能时,我们就应该考虑一下专业的地图应用了。而调用第三方地图应用的正确姿势是,只需要通过一个带着导航参数的 URL 链接去打开第三方应用。即方法:
- (BOOL)openURL:(NSURL*)url ;
要进行跳转需要先在 Xcode
的 info.plist
文件内将目标App的url Scheme
加入白名单(LSApplicationQueriesSchemes
)。
常见第三方地图 App 的 url Scheme
百度地图:baidumap
高德地图:iosamap
腾讯地图:qqmap
info.plist
的白名单设置:
在 plist
文件新增LSApplicationQueriesSchemes
关键字,类型为NSArray
,并在其下添加子目录,类型为NSString
,内容为各地图对应的url Scheme
。
提供参数说明的官网地址:
高德地图:URL Scheme: iosamap://
百度地图:URL Scheme: baidumap://
腾讯地图:URL Scheme: qqmap://
代码实现:
为了方便调用,创建一个对象类来存储地图名称和跳转链接:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface MapAppInfo : NSObject
@property (nonatomic, strong) NSString *appName;
@property (nonatomic, strong) NSString *mapUrl;
@end
NS_ASSUME_NONNULL_END
根据用户已安装的第三方导航应用来管理数据:
// 应用名称
NSDictionary *dicInfo = [[NSBundle mainBundle] infoDictionary];
NSString *appName = dicInfo[@"CFBundleDisplayName"];
NSMutableArray *arrmTemp = [NSMutableArray arrayWithCapacity:100];
// 高德地图
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {
MapAppInfo *mapInfo = [MapAppInfo new];
[mapInfo setAppName:@"高德地图"];
NSMutableString *strmUrl = [NSMutableString stringWithFormat:@"iosamap://path?sourceApplication=%@", appName];
// 目的地
[strmUrl appendFormat:@"&dname=%@", @"深圳市民中心"];
// 目的地的火星坐标
[strmUrl appendFormat:@"&dlat=%@&dlon=%@", @"22.5", @"114.0"];
// t = 0(驾车)= 1(公交)= 2(步行)= 3(骑行)= 4(火车)= 5(长途客车)
[strmUrl appendFormat:@"&t=%@", @"2"];
[strmUrl appendFormat:@"&dev=0"];
mapInfo.mapUrl = strmUrl;
[arrmTemp addObject:mapInfo];
}
// 百度地图
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]]) {
MapAppInfo *mapInfo = [MapAppInfo new];
[mapInfo setAppName:@"百度地图"];
NSMutableString *strmUrl = [NSMutableString stringWithFormat:@"baidumap://map/direction?"];
// 目的地名称及火星坐标
[strmUrl appendFormat:@"destination=name:%@|latlng:%@,%@&", @"深圳市民中心", @"22.5", @"114.0"];
// 方式
[strmUrl appendFormat:@"mode=%@&", @"walking"];
// 火星坐标
[strmUrl appendFormat:@"coord_type=gcj02&"];
// 应用名称
[strmUrl appendFormat:@"src=ios.%@", appName];
mapInfo.mapUrl = strmUrl;
[arrmTemp addObject:mapInfo];
}
// 腾讯地图
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"qqmap://"]]) {
MapAppInfo *mapInfo = [MapAppInfo new];
[mapInfo setAppName:@"腾讯地图"];
// 注:以我的位置为起点时,需要加入 “from=我的位置”,否则跳转之后的起点位置为待输入状态
NSMutableString *strmUrl = [NSMutableString stringWithFormat:@"qqmap://map/routeplan?from=我的位置&"];
// 目的地
[strmUrl appendFormat:@"to=%@&", @"深圳市民中心"];
// 目的地的火星坐标
[strmUrl appendFormat:@"tocoord=%@,%@&", @"22.5", @"114.0"];
// 交通方式
[strmUrl appendFormat:@"type=%@&", @"walk"];
[strmUrl appendFormat:@"referer=%@", @"5ZABZ-6N4K5-F7EIZ-QUKIR-PC5IT-46BYM"];
mapInfo.mapUrl = strmUrl;
[arrmTemp addObject:mapInfo];
}
self.arrMapScheme = arrmTemp;
最后,在调用时,我们的起点和目的地由于使用了中文,所以需要发起调用的时候,将 URL 转为 UTF-8
的格式:
NSString *strURL = self.arrMapScheme[0].mapUrl;
strURL = [strURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:strURL]];
[self cancelAction];
就是这样了!