import Flutter import UIKit import AMapNaviKit /// 登录之后才允许创建会弹出系统权限框的对象。键和通知名与 AppDelegate 一致。 enum PostLoginHardware { static let readyKey = "sp_hardware_ready" static let armNote = Notification.Name("sp.hardware.arm") static func whenReady(_ body: @escaping () -> Void) { if UserDefaults.standard.bool(forKey: readyKey) { DispatchQueue.main.async(execute: body) return } var token: NSObjectProtocol? token = NotificationCenter.default.addObserver( forName: armNote, object: nil, queue: .main ) { _ in if let token { NotificationCenter.default.removeObserver(token) } body() } } } public class AmapServicePlugin: NSObject, FlutterPlugin, FlutterStreamHandler { private static var channel: FlutterMethodChannel? private var eventSink: FlutterEventSink? public static func register(with registrar: FlutterPluginRegistrar) { let methodChannel = FlutterMethodChannel( name: "com.yunqiinnovation.amap_service", binaryMessenger: registrar.messenger() ) let eventChannel = FlutterEventChannel( name: "com.yunqiinnovation.amap_service/events", binaryMessenger: registrar.messenger() ) let instance = AmapServicePlugin() eventChannel.setStreamHandler(instance) // 高德一初始化就会触发「查找本地网络中的设备」。延到登录之后。 PostLoginHardware.whenReady { AMapServices.shared()?.apiKey = "6144a636c24dc9f2e1e57f7597849cf7" AMapServices.shared()?.enableHTTPS = true if #available(iOS 13.0, *) { AMapNaviManagerConfig.shared().updatePrivacyShow(.didShow, privacyInfo: .didContain) AMapNaviManagerConfig.shared().updatePrivacyAgree(.didAgree) } print("高德SDK初始化完成") } registrar.addMethodCallDelegate(instance, channel: methodChannel) self.channel = methodChannel } // MARK: - FlutterStreamHandler public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { self.eventSink = events return nil } public func onCancel(withArguments arguments: Any?) -> FlutterError? { eventSink = nil return nil } // MARK: - 事件发送方法 private func sendEvent(eventName: String, data: [String: Any]) { guard let sink = eventSink else { return } let eventData: [String: Any] = [ "event": eventName, "data": data ] sink(eventData) } // MARK: - 方法处理 public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "open": guard let args = call.arguments as? [String: Any], let startpos = args["startpos"] as? String, let endpos = args["endpos"] as? String, let ntype = args["ntype"] as? String else { result(FlutterError(code: "INVALID_ARGUMENT", message: "Missing arguments", details: nil)) return } print("打开导航页面: \(startpos) → \(endpos)") DispatchQueue.main.async { let navVC = AmapViewController(startpos: startpos, endpos: endpos) navVC.modalPresentationStyle = .fullScreen UIApplication.shared.keyWindow?.rootViewController?.present(navVC, animated: true) } result(nil) case "start": guard let args = call.arguments as? [String: Any], let startpos = args["startpos"] as? String, let endpos = args["endpos"] as? String, let ntype = args["ntype"] as? String else { result(FlutterError(code: "INVALID_ARGUMENT", message: "Missing arguments", details: nil)) return } // 这里添加实际导航启动逻辑 print("开始导航: \(startpos) → \(endpos), 类型: \(ntype)") sendEvent(eventName: "navigation_started", data: ["status": "success"]) result(nil) case "stop": // 这里添加停止导航逻辑 print("停止导航") sendEvent(eventName: "navigation_stopped", data: ["status": "success"]) result(nil) default: result(FlutterMethodNotImplemented) } } }