iOS 第三方地图导航开发与实践

当开发简单的地图功能时,我们可以使用集成地图 SDK 来开发相应的功能,但是要开发导航这种复杂的功能时,我们就应该考虑一下专业的地图应用了。而调用第三方地图应用的正确姿势是,只需要通过一个带着导航参数的 URL 链接去打开第三方应用。即方法:

- (BOOL)openURL:(NSURL*)url ;

要进行跳转需要先在 Xcodeinfo.plist 文件内将目标App的url Scheme加入白名单(LSApplicationQueriesSchemes)。

常见第三方地图 App 的 url Scheme

百度地图:baidumap
高德地图:iosamap
腾讯地图:qqmap

info.plist 的白名单设置:
plist 文件新增LSApplicationQueriesSchemes 关键字,类型为NSArray,并在其下添加子目录,类型为NSString,内容为各地图对应的url Scheme

url Scheme 配置

提供参数说明的官网地址:
高德地图:URL Scheme: iosamap://
百度地图:URL Scheme: baidumap://
腾讯地图:URL Scheme: qqmap://

代码实现:
为了方便调用,创建一个对象类来存储地图名称和跳转链接:

#import 

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

就是这样了!

你可能感兴趣的:(iOS 第三方地图导航开发与实践)