【ios】导航跳转

原创
2016/09/28 17:57
阅读数 112


public class MapNavigationKit: NSObject {
    
    public enum MapType {
        // 苹果
        case apple
        // 谷歌
        case google
        // 百度
        case baidu
        // 高德
        case amap
        // 腾讯地图
        case tencent
        
        var openURL: String {
            switch self {
            case .apple:
                return "http://maps.apple.com/"
            case .amap:
                return "iosamap://"
            case .baidu:
                return "baidumap://"
            case .google:
                return "comgooglemaps://"
            case .tencent:
                return "qqmap://"
            }
        }
        
        var appName: String {
            switch self {
            case .apple:
                return NSLocalizedString("NAVIGATION_APPLE", comment: "苹果地图")
            case .amap:
                return NSLocalizedString("NAVIGATION_AMAP", comment: "高德地图")
            case .baidu:
                return NSLocalizedString("NAVIGATION_BAIDU", comment: "百度地图")
            case .google:
                return NSLocalizedString("NAVIGATION_GOOGLE", comment: "谷歌地图")
            case .tencent:
                return NSLocalizedString("NAVIGATION_TENCENT", comment: "腾讯地图")
            }
        }
        
        var parameterFormat: String {
            switch self {
            case .apple:
                return ""
            case .amap:
                return "iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%f&lon=%f&dev=0&style=2"
            case .baidu:
                return "baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name=目的地&mode=driving&coord_type=gcj02"
            case .google:
                return "comgooglemaps://?x-source=%@&x-success=%@&saddr=&daddr=%f,%f&directionsmode=driving"
            case .tencent:
                return "qqmap://map/routeplan?type=drive&fromcoord=%f,%f&tocoord=%f,%f&coord_type=1&policy=0"
            }
        }
    }
    
    public static let shared = MapNavigationKit()
    fileprivate var _mapTypes: [MapType] = [.apple, .google, .baidu, .amap, .tencent]
    fileprivate var _fromCoordinate = CLLocationCoordinate2D(latitude: 0, longitude: 0)
    fileprivate var _toCoordinate = CLLocationCoordinate2D(latitude: 0, longitude: 0)
    
    private override init() {
        super.init()
    }
    
    /*
     弹出对话框
     
     - parameter coordinate:        经纬度(GCJ)
     - parameter view:              当前的ViewController
     */
    public func selectMapApp(fromCoordinate: CLLocationCoordinate2D, toCoordinate: CLLocationCoordinate2D, view: UIView) {
        _fromCoordinate = fromCoordinate
        _toCoordinate = toCoordinate
        let actionSheet = UIActionSheet(title: nil,
                                        delegate: self,
                                        cancelButtonTitle: NSLocalizedString("SECURE_AREA_DELETE_CANCEL", comment: "取消"),
                                        destructiveButtonTitle: nil)
        _mapTypes.forEach { (type) in
            if UIApplication.shared.canOpenURL(URL(string: type.openURL)!) == true {
                actionSheet.addButton(withTitle: type.appName)
            }
        }
        actionSheet.show(in: view)
    }

}

extension MapNavigationKit: UIActionSheetDelegate {
    
    public func actionSheet(_ actionSheet: UIActionSheet, clickedButtonAt buttonIndex: Int) {
        guard let buttonTitle = actionSheet.buttonTitle(at: buttonIndex) else {
            return
        }
        let appName = "自己根据需求填写"
        let urlScheme = "自己根据需求填写"
        switch buttonTitle {
        case MapType.apple.appName:
            let currentLocation = MKMapItem.forCurrentLocation()
            let toLocation = MKMapItem(placemark: MKPlacemark(coordinate: _toCoordinate, addressDictionary: nil))
            MKMapItem.openMaps(with: [currentLocation, toLocation], launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving,
                                                                                    MKLaunchOptionsShowsTrafficKey: true])
        case MapType.google.appName:
            guard let url = String(format: MapType.google.parameterFormat, appName, urlScheme, _toCoordinate.latitude, _toCoordinate.longitude).addingPercentEscapes(using: String.Encoding.utf8) else {
                return
            }
            UIApplication.shared.openURL(URL(string: url)!)
        case MapType.amap.appName:
            guard let url = String(format: MapType.amap.parameterFormat, appName, urlScheme, _toCoordinate.latitude, _toCoordinate.longitude).addingPercentEscapes(using: String.Encoding.utf8) else {
                return
            }
            UIApplication.shared.openURL(URL(string: url)!)
        case MapType.baidu.appName:
            guard let url = String(format: MapType.baidu.parameterFormat, _toCoordinate.latitude, _toCoordinate.longitude).addingPercentEscapes(using: String.Encoding.utf8) else {
                return
            }
            UIApplication.shared.openURL(URL(string: url)!)
        case MapType.tencent.appName:
            guard let url = String(format: MapType.tencent.parameterFormat, _fromCoordinate.latitude, _fromCoordinate.longitude, _toCoordinate.latitude, _toCoordinate.longitude).addingPercentEscapes(using: String.Encoding.utf8) else {
                return
            }
            UIApplication.shared.openURL(URL(string: url)!)
        default:
            return
        }
    }
    
}

 

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部