美文网首页iOS开发iOS Developer
IOS 应用内打开三方地图app直接导航

IOS 应用内打开三方地图app直接导航

作者: Apple_JinlongLu | 来源:发表于2017-05-10 19:55 被阅读575次

    简书

    当然因为有需求喽。

    疯狂试探
    - (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);

    常用地图应用的url Scheme:

    //百度地图  
    baidumap 
    //高德地图  
    iosamap 
    //谷歌地图 
    comgooglemaps  
    //腾讯地图
    qqmap   
    //其他地图省略  
    …. 
    

    苹果地图不需要,iOS API提供了一个跳转打开方法。
    注意IOS9之后,plist里面设置url scheme白名单

    
    <key>LSApplicationQueriesSchemes</key>
        <array>
            <string>qqmap</string>
            <string>comgooglemaps</string>
            <string>iosamap</string>
            <string>baidumap</string>
        </array>
    
    

    在下用的是高德坐标
    高德转坐标类型枚举

    //        AMapCoordinateTypeBaidu = 0,    ///<Baidu
    //        AMapCoordinateTypeMapBar,       ///<MapBar
    //        AMapCoordinateTypeMapABC,       ///<MapABC
    //        AMapCoordinateTypeSoSoMap,      ///<SoSoMap
    //        AMapCoordinateTypeAliYun,       ///<AliYun
    //        AMapCoordinateTypeGoogle,       ///<Google
    //        AMapCoordinateTypeGPS,          ///<GPS
    

    在下试过转百度用AMapCoordinateTypeBaidu,这样一一对应的方式转,但跳转之后误差很大,后来我试着杂交匹配一下,所有地图使用Google转法最准,所以除高德地图都用了Google转出的坐标

    重点来了!!!!

    - (void)pushMapLan:(CGFloat)lan Lon:(CGFloat)lon pointName:(NSString *)title {
        
        UIAlertController *alertSheet = [UIAlertController alertControllerWithTitle:title message:@"请选择以下驾车导航方式" preferredStyle:UIAlertControllerStyleActionSheet];
        
    //        高德坐标转换百度坐标
        CLLocationCoordinate2D gps = AMapCoordinateConvert(CLLocationCoordinate2DMake(lan,lon), AMapCoordinateTypeGoogle);
    //        --------------------------------------------------
        
        if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]]) {
            NSMutableDictionary *baiduMapDic = [NSMutableDictionary dictionary];
            baiduMapDic[@"title"] = @"百度地图";
            NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name=北京&mode=driving&coord_type=gcj02",gps.latitude,gps.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            baiduMapDic[@"url"] = urlString;
            [alertSheet addAction:[UIAlertAction actionWithTitle:baiduMapDic[@"title"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:baiduMapDic[@"url"]]];
            }]];
        }
        
        //高德地图
        if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {
            NSMutableDictionary *gaodeMapDic = [NSMutableDictionary dictionary];
            gaodeMapDic[@"title"] = @"高德地图";
            NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%f&lon=%f&dev=0&style=2",@"导航功能",@"poapoaaldoerccbadersvsruhdk",lan,lon] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            gaodeMapDic[@"url"] = urlString;
            [alertSheet addAction:[UIAlertAction actionWithTitle:gaodeMapDic[@"title"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:gaodeMapDic[@"url"]]];
            }]];
        }
        
        //谷歌地图
        if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"comgooglemaps://"]]) {
            NSMutableDictionary *googleMapDic = [NSMutableDictionary dictionary];
            googleMapDic[@"title"] = @"谷歌地图";
            NSString *urlString = [[NSString stringWithFormat:@"comgooglemaps://?x-source=%@&x-success=%@&saddr=&daddr=%f,%f&directionsmode=driving",@"驾车导航",@"poapoaaldoerccbadersvsruhdk",gps.latitude,gps.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            googleMapDic[@"url"] = urlString;
            [alertSheet addAction:[UIAlertAction actionWithTitle:googleMapDic[@"title"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:googleMapDic[@"url"]]];
            }]];
        }
        
        //腾讯地图
        if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"qqmap://"]]) {
            NSMutableDictionary *qqMapDic = [NSMutableDictionary dictionary];
            
            qqMapDic[@"title"] = @"腾讯地图";
            NSString *urlString = [[NSString stringWithFormat:@"qqmap://map/routeplan?from=我的位置&type=drive&tocoord=%f,%f&to=终点&coord_type=1&policy=0",gps.latitude,gps.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            qqMapDic[@"url"] = urlString;
            [alertSheet addAction:[UIAlertAction actionWithTitle:qqMapDic[@"title"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:qqMapDic[@"url"]]];
            }]];
        }
        NSMutableDictionary *iosMapDic = [NSMutableDictionary dictionary];
        iosMapDic[@"title"] = @"苹果地图";
        [alertSheet addAction:[UIAlertAction actionWithTitle:iosMapDic[@"title"] style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
            CLLocationCoordinate2D gps = AMapCoordinateConvert(CLLocationCoordinate2DMake(lan,lon), AMapCoordinateTypeGoogle);
            
            MKMapItem *currentLoc = [MKMapItem mapItemForCurrentLocation];
            MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:gps addressDictionary:nil]];
            toLocation.name = title;
            NSArray *items = @[currentLoc,toLocation];
            NSDictionary *dic = @{
                                  MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
                                  MKLaunchOptionsMapTypeKey : @(MKMapTypeStandard),
                                  MKLaunchOptionsShowsTrafficKey : @(YES)
                                  };
            
            [MKMapItem openMapsWithItems:items launchOptions:dic];
        }]];
        
        [alertSheet addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        }]];
        
        [self presentViewController:alertSheet animated:YES completion:nil];
        
    }
    
    

    关于转换坐标,如果你用的是高德坐标系,除了高德地图不用转坐标系外,其他的都以高德sdk里转Google的方式转,保证目的地精确。
    其他的就自己探索咯!
    建议 第三方的转换方法【github】地址,找不到合适的尝试这个。


    谢谢!

    [上一篇]:iOS UITextField输入银行卡号校验设置

    [下一篇]:iOS/macOC info.plist权限配置






    我的专题:

    iOS开发

    Mac汉化(游戏/软件)

    相关文章

      网友评论

        本文标题:IOS 应用内打开三方地图app直接导航

        本文链接:https://www.haomeiwen.com/subject/gingtxtx.html