1:添加白名单
在 info.plist 文件里面,添加一个字段:LSApplicationQueriesSchemes
2:跳转到相应App
高德地图
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {
NSString *urlString = [[NSString stringWithFormat:@"iosamap://path?sourceApplication=AppName&sid=&sname=%@&did=&dlat=%@&dlon=%@&dname=%@&dev=0&t=0",@"我的位置",lat,lng,@"终点位置"] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString] options:@{} completionHandler:nil];
}
百度地图
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]]) {
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%@,%@|name:%@&mode=driving&coord_type=bd09ll",lat,lng,@"终点位置"] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString] options:@{} completionHandler:nil];
}
注意点: 终点名称或经纬度可以同时提供或者提供一个,如果同时存在经纬度和终点位置此时经纬度优先级高,将作为导航依据,名称只负责展示。
3:关于URL
唤起的URL中的参数名和跳转地图后的其他功能展示如:POI(地点)检索等,我给大家整理以下百度和高德SDK文档地址,详细介绍了不同功能对应的唤起URL和通用参数解释:
最后
关于使用不同地图SDK获得的经纬度,在跳转第三方地图后有误差的问题,是因为高德和百度使用的坐标系不一样导致;而这里我建议大家使用高德地图SDK定位或者原生的定位功能,因为百度地图使用了BD09ll,高德是GCJ02, 百度url里面有提供参数 coord_type
,把该参数设置为 GCJ02 即可转换坐标系,如果你用的是百度SDK定位获取的经纬度,由于高德方面并没有对应转换的参数,所以这就需要我们自己手动转换比较麻烦了,最后附上百度坐标转高德坐标
/**
百度坐标转高德坐标
@param glat 纬度
@param glon 经度
@return 数组【转换后的纬度,转换后的经度】
*/
+ (NSArray *)bd09llToGCJLat:(double)glat lon:(double)glon {
double X_PI = M_PI * 3000.0 / 180.0;
double x = glon - 0.0065;
double y = glat - 0.006;
double z = sqrt(x * x + y * y) - 0.00002 * sin(y * X_PI);
double theta = atan2(y, x) - 0.000003 * cos(x * X_PI);
double lat = z * sin(theta);
double lon = z * cos(theta);
NSArray *latlon = @[[NSNumber numberWithDouble:lat],[NSNumber numberWithDouble:lon]];
return latlon;
}