IOS 應用內打開三方地圖app直接導航 我的專題: iOS開發 Mac漢化(遊戲/軟件)

簡書

當然因爲有需求嘍。

瘋狂試探
- (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漢化(遊戲/軟件)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章