MapMapkitIosPlugin.swift 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import Flutter
  2. import UIKit
  3. enum MapSupportedPackage: String {
  4. case traceLocation1 = "com.shishi.dingwei"
  5. }
  6. var currentPackage: MapSupportedPackage {
  7. if let bundleId = Bundle.main.bundleIdentifier {
  8. if bundleId.hasPrefix(MapSupportedPackage.traceLocation1.rawValue) {
  9. return .traceLocation1
  10. }
  11. }
  12. return .traceLocation1
  13. }
  14. public class MapMapkitIosPlugin: NSObject, FlutterPlugin {
  15. public static func register(with registrar: FlutterPluginRegistrar) {
  16. let factory = MapFlutterViewFactory(messenger: registrar.messenger())
  17. registrar.register(factory, withId: MapKitConstans.mapViewId, gestureRecognizersBlockingPolicy: FlutterPlatformViewGestureRecognizersBlockingPolicyWaitUntilTouchesEnded)
  18. // 注册通用方法通道
  19. CommonMethodChannelHandler.shared.setBinaryMessenger(binaryMessenger: registrar.messenger())
  20. let commonMethodChannel = FlutterMethodChannel(name: MapKitConstans.commonMethodChannelName, binaryMessenger: registrar.messenger())
  21. commonMethodChannel.setMethodCallHandler { (call, result) in
  22. CommonMethodChannelHandler.shared.handleMethodCall(call: call, result: result)
  23. }
  24. }
  25. }
  26. class CommonMethodChannelHandler: NSObject {
  27. private var binaryMessenger: FlutterBinaryMessenger?
  28. static let shared = CommonMethodChannelHandler()
  29. private override init() {
  30. super.init()
  31. }
  32. func setBinaryMessenger(binaryMessenger: FlutterBinaryMessenger) {
  33. LocationManager.shared.initChannel(withMessenger: binaryMessenger)
  34. self.binaryMessenger = binaryMessenger
  35. }
  36. func handleMethodCall(call: FlutterMethodCall, result: @escaping FlutterResult) {
  37. handleCommonMethodCall(call: call, result: result)
  38. }
  39. private func handleCommonMethodCall(call: FlutterMethodCall, result: @escaping FlutterResult) {
  40. guard let callMethod = CommonChannelMethod(rawValue: call.method) else {
  41. result(FlutterMethodNotImplemented)
  42. return
  43. }
  44. switch callMethod {
  45. case .`init`:
  46. result(true)
  47. handleStartLocation(result: result)
  48. case .getPlatformMapName:
  49. result("map_mapkit_ios")
  50. case .startLocation:
  51. handleStartLocation(result: result)
  52. }
  53. }
  54. private func handleStartLocation(result: @escaping FlutterResult) {
  55. guard let binaryMessenger else { return }
  56. let isSuccess = LocationManager.shared.start(withMessenger: binaryMessenger)
  57. if !isSuccess {
  58. result(FlutterError(code: "LocationPermissionError", message: "Location permission not granted", details: nil))
  59. return
  60. }
  61. }
  62. }