iOS调用第三方地图App进行导航方法
前言
- App内根据手机上装载的地图App将其显示在弹出的选择框,选择对应地图跳转进入地图导航。需要用到
- (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);
方法判断手机是否已安装相应地图App。 - 要进行跳转需要先在xcode的plist文件内将目标App的url Scheme加入白名单(LSApplicationQueriesSchemes)。
常见第三方地图App的url Scheme
- 百度地图:baidumap
- 高德地图:iosamap
- 谷歌地图:comgooglemaps
- 腾讯地图:qqmap
plist文件新增LSApplicationQueriesSchemes
关键字,类型为NSArray,并在其下添加子目录,类型为NSString,内容为各地图对应的url Scheme。
白名单LSApplicationQueriesSchemes:
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | //导航只需要目的地经纬度,endLocation为纬度、经度的数组 -( void )doNavigationWithEndLocation:( NSArray *)endLocation { //NSArray * endLocation = [NSArray arrayWithObjects:@"26.08",@"119.28", nil]; NSMutableArray *maps = [ NSMutableArray array]; //苹果原生地图-苹果原生地图方法和其他不一样 NSMutableDictionary *iosMapDic = [ NSMutableDictionary dictionary]; iosMapDic[@ "title" ] = @ "苹果地图" ; [maps addObject:iosMapDic]; //百度地图 if ([[UIApplication sharedApplication] canOpenURL:[ NSURL URLWithString:@ "baidumap://" ]]) { NSMutableDictionary *baiduMapDic = [ NSMutableDictionary dictionary]; baiduMapDic[@ "title" ] = @ "百度地图" ; NSString *urlString = [[ NSString stringWithFormat:@ "baidumap://map/direction?origin={{我的位置}}&destination=latlng:%@,%@|name=北京&mode=driving&coord_type=gcj02" ,endLocation[0],endLocation[1]] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding ]; baiduMapDic[@ "url" ] = urlString; [maps addObject:baiduMapDic]; } //高德地图 if ([[UIApplication sharedApplication] canOpenURL:[ NSURL URLWithString:@ "iosamap://" ]]) { NSMutableDictionary *gaodeMapDic = [ NSMutableDictionary dictionary]; gaodeMapDic[@ "title" ] = @ "高德地图" ; NSString *urlString = [[ NSString stringWithFormat:@ "iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%@&lon=%@&dev=0&style=2" ,@ "导航功能" ,@ "nav123456" ,endLocation[0],endLocation[1]] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding ]; gaodeMapDic[@ "url" ] = urlString; [maps addObject:gaodeMapDic]; } //谷歌地图 if ([[UIApplication sharedApplication] canOpenURL:[ NSURL URLWithString:@ "comgooglemaps://" ]]) { NSMutableDictionary *googleMapDic = [ NSMutableDictionary dictionary]; googleMapDic[@ "title" ] = @ "谷歌地图" ; NSString *urlString = [[ NSString stringWithFormat:@ "comgooglemaps://?x-source=%@&x-success=%@&saddr=&daddr=%@,%@&directionsmode=driving" ,@ "导航测试" ,@ "nav123456" ,endLocation[0], endLocation[1]] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding ]; googleMapDic[@ "url" ] = urlString; [maps addObject:googleMapDic]; } //腾讯地图 if ([[UIApplication sharedApplication] canOpenURL:[ NSURL URLWithString:@ "qqmap://" ]]) { NSMutableDictionary *qqMapDic = [ NSMutableDictionary dictionary]; qqMapDic[@ "title" ] = @ "腾讯地图" ; NSString *urlString = [[ NSString stringWithFormat:@ "qqmap://map/routeplan?from=我的位置&type=drive&tocoord=%@,%@&to=终点&coord_type=1&policy=0" ,endLocation[0], endLocation[1]] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding ]; qqMapDic[@ "url" ] = urlString; [maps addObject:qqMapDic]; } //选择 UIAlertController * alert = [UIAlertController alertControllerWithTitle:@ "选择地图" message: nil preferredStyle:UIAlertControllerStyleActionSheet]; NSInteger index = maps.count; for ( int i = 0; i < index; i++) { NSString * title = maps[i][@ "title" ]; //苹果原生地图方法 if (i == 0) { UIAlertAction * action = [UIAlertAction actionWithTitle:title style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) { [ self navAppleMap]; }]; [alert addAction:action]; continue ; } UIAlertAction * action = [UIAlertAction actionWithTitle:title style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { NSString *urlString = maps[i][@ "url" ]; [[UIApplication sharedApplication] openURL:[ NSURL URLWithString:urlString]]; }]; [alert addAction:action]; } [ self presentViewController:alert animated: YES completion: nil ]; } //苹果地图 - ( void )navAppleMap { // CLLocationCoordinate2D gps = [JZLocationConverter bd09ToWgs84:self.destinationCoordinate2D]; //终点坐标 CLLocationCoordinate2D loc = CLLocationCoordinate2DMake(26.08, 119.28); //用户位置 MKMapItem *currentLoc = [MKMapItem mapItemForCurrentLocation]; //终点位置 MKMapItem *toLocation = [[MKMapItem alloc]initWithPlacemark:[[MKPlacemark alloc]initWithCoordinate:loc addressDictionary: nil ] ]; NSArray *items = @[currentLoc,toLocation]; //第一个 NSDictionary *dic = @{ MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving, MKLaunchOptionsMapTypeKey : @(MKMapTypeStandard), MKLaunchOptionsShowsTrafficKey : @( YES ) }; //第二个,都可以用 // NSDictionary * dic = @{MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving, // MKLaunchOptionsShowsTrafficKey: [NSNumber numberWithBool:YES]}; [MKMapItem openMapsWithItems:items launchOptions:dic]; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 如何打造一个高并发系统?
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
2016-03-23 OC-Foundation框架