expo-gaode-map-navigation 2.0.8 → 2.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +233 -3
  2. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapModule.kt +4 -2
  3. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviView.kt +931 -391
  4. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviViewModule.kt +86 -1
  5. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNavigationModule.kt +4 -5
  6. package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/IndependentRouteListener.kt +4 -3
  7. package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/RouteCalculateListener.kt +2 -2
  8. package/android/src/main/java/expo/modules/gaodemap/navigation/managers/IndependentRouteManager.kt +96 -14
  9. package/android/src/main/java/expo/modules/gaodemap/navigation/routes/drive/DriveTruckRouteCalculator.kt +2 -0
  10. package/android/src/main/java/expo/modules/gaodemap/navigation/utils/Converters.kt +19 -10
  11. package/android/src/main/res/drawable/landback_0.png +0 -0
  12. package/android/src/main/res/drawable/landback_1.png +0 -0
  13. package/android/src/main/res/drawable/landback_2.png +0 -0
  14. package/android/src/main/res/drawable/landback_3.png +0 -0
  15. package/android/src/main/res/drawable/landback_4.png +0 -0
  16. package/android/src/main/res/drawable/landback_5.png +0 -0
  17. package/android/src/main/res/drawable/landback_6.png +0 -0
  18. package/android/src/main/res/drawable/landback_7.png +0 -0
  19. package/android/src/main/res/drawable/landback_8.png +0 -0
  20. package/android/src/main/res/drawable/landback_9.png +0 -0
  21. package/android/src/main/res/drawable/landback_a.png +0 -0
  22. package/android/src/main/res/drawable/landback_b.png +0 -0
  23. package/android/src/main/res/drawable/landback_c.png +0 -0
  24. package/android/src/main/res/drawable/landback_d.png +0 -0
  25. package/android/src/main/res/drawable/landback_e.png +0 -0
  26. package/android/src/main/res/drawable/landback_f.png +0 -0
  27. package/android/src/main/res/drawable/landback_g.png +0 -0
  28. package/android/src/main/res/drawable/landback_h.png +0 -0
  29. package/android/src/main/res/drawable/landback_i.png +0 -0
  30. package/android/src/main/res/drawable/landback_j.png +0 -0
  31. package/android/src/main/res/drawable/landback_k.png +0 -0
  32. package/android/src/main/res/drawable/landback_l.png +0 -0
  33. package/android/src/main/res/drawable/landfront_0.png +0 -0
  34. package/android/src/main/res/drawable/landfront_00.png +0 -0
  35. package/android/src/main/res/drawable/landfront_1.png +0 -0
  36. package/android/src/main/res/drawable/landfront_11.png +0 -0
  37. package/android/src/main/res/drawable/landfront_20.png +0 -0
  38. package/android/src/main/res/drawable/landfront_21.png +0 -0
  39. package/android/src/main/res/drawable/landfront_22.png +0 -0
  40. package/android/src/main/res/drawable/landfront_3.png +0 -0
  41. package/android/src/main/res/drawable/landfront_33.png +0 -0
  42. package/android/src/main/res/drawable/landfront_40.png +0 -0
  43. package/android/src/main/res/drawable/landfront_43.png +0 -0
  44. package/android/src/main/res/drawable/landfront_44.png +0 -0
  45. package/android/src/main/res/drawable/landfront_5.png +0 -0
  46. package/android/src/main/res/drawable/landfront_55.png +0 -0
  47. package/android/src/main/res/drawable/landfront_61.png +0 -0
  48. package/android/src/main/res/drawable/landfront_63.png +0 -0
  49. package/android/src/main/res/drawable/landfront_66.png +0 -0
  50. package/android/src/main/res/drawable/landfront_70.png +0 -0
  51. package/android/src/main/res/drawable/landfront_71.png +0 -0
  52. package/android/src/main/res/drawable/landfront_73.png +0 -0
  53. package/android/src/main/res/drawable/landfront_77.png +0 -0
  54. package/android/src/main/res/drawable/landfront_8.png +0 -0
  55. package/android/src/main/res/drawable/landfront_88.png +0 -0
  56. package/android/src/main/res/drawable/landfront_90.png +0 -0
  57. package/android/src/main/res/drawable/landfront_95.png +0 -0
  58. package/android/src/main/res/drawable/landfront_99.png +0 -0
  59. package/android/src/main/res/drawable/landfront_a0.png +0 -0
  60. package/android/src/main/res/drawable/landfront_a8.png +0 -0
  61. package/android/src/main/res/drawable/landfront_aa.png +0 -0
  62. package/android/src/main/res/drawable/landfront_b1.png +0 -0
  63. package/android/src/main/res/drawable/landfront_b5.png +0 -0
  64. package/android/src/main/res/drawable/landfront_bb.png +0 -0
  65. package/android/src/main/res/drawable/landfront_c3.png +0 -0
  66. package/android/src/main/res/drawable/landfront_c8.png +0 -0
  67. package/android/src/main/res/drawable/landfront_cc.png +0 -0
  68. package/android/src/main/res/drawable/landfront_d.png +0 -0
  69. package/android/src/main/res/drawable/landfront_dd.png +0 -0
  70. package/android/src/main/res/drawable/landfront_e1.png +0 -0
  71. package/android/src/main/res/drawable/landfront_e5.png +0 -0
  72. package/android/src/main/res/drawable/landfront_ee.png +0 -0
  73. package/android/src/main/res/drawable/landfront_f0.png +0 -0
  74. package/android/src/main/res/drawable/landfront_f1.png +0 -0
  75. package/android/src/main/res/drawable/landfront_f5.png +0 -0
  76. package/android/src/main/res/drawable/landfront_ff.png +0 -0
  77. package/android/src/main/res/drawable/landfront_g3.png +0 -0
  78. package/android/src/main/res/drawable/landfront_g5.png +0 -0
  79. package/android/src/main/res/drawable/landfront_gg.png +0 -0
  80. package/android/src/main/res/drawable/landfront_h1.png +0 -0
  81. package/android/src/main/res/drawable/landfront_h3.png +0 -0
  82. package/android/src/main/res/drawable/landfront_h5.png +0 -0
  83. package/android/src/main/res/drawable/landfront_hh.png +0 -0
  84. package/android/src/main/res/drawable/landfront_i0.png +0 -0
  85. package/android/src/main/res/drawable/landfront_i3.png +0 -0
  86. package/android/src/main/res/drawable/landfront_i5.png +0 -0
  87. package/android/src/main/res/drawable/landfront_ii.png +0 -0
  88. package/android/src/main/res/drawable/landfront_j1.png +0 -0
  89. package/android/src/main/res/drawable/landfront_j8.png +0 -0
  90. package/android/src/main/res/drawable/landfront_jj.png +0 -0
  91. package/android/src/main/res/drawable/landfront_kk.png +0 -0
  92. package/android/src/main/res/drawable/landfront_ll.png +0 -0
  93. package/android/src/main/res/drawable/navi_arrow_leftline.png +0 -0
  94. package/android/src/main/res/drawable/navi_lane_shape_bg_center.xml +5 -0
  95. package/android/src/main/res/drawable/navi_lane_shape_bg_left.xml +8 -0
  96. package/android/src/main/res/drawable/navi_lane_shape_bg_over.xml +6 -0
  97. package/android/src/main/res/drawable/navi_lane_shape_bg_right.xml +8 -0
  98. package/build/ExpoGaodeMapNaviView.d.ts +8 -0
  99. package/build/ExpoGaodeMapNaviView.d.ts.map +1 -1
  100. package/build/ExpoGaodeMapNaviView.js +38 -1
  101. package/build/ExpoGaodeMapNaviView.js.map +1 -1
  102. package/build/index.d.ts +8 -4
  103. package/build/index.d.ts.map +1 -1
  104. package/build/index.js +408 -4
  105. package/build/index.js.map +1 -1
  106. package/build/types/independent.types.d.ts +91 -0
  107. package/build/types/independent.types.d.ts.map +1 -1
  108. package/build/types/independent.types.js.map +1 -1
  109. package/build/types/naviview.types.d.ts +256 -12
  110. package/build/types/naviview.types.d.ts.map +1 -1
  111. package/build/types/naviview.types.js.map +1 -1
  112. package/build/types/route.types.d.ts +2 -0
  113. package/build/types/route.types.d.ts.map +1 -1
  114. package/build/types/route.types.js.map +1 -1
  115. package/ios/ExpoGaodeMapNaviView.swift +888 -66
  116. package/ios/ExpoGaodeMapNaviViewModule.swift +87 -1
  117. package/ios/ExpoGaodeMapNavigationModule.swift +1 -1
  118. package/ios/managers/IndependentRouteManager.swift +1 -0
  119. package/ios/map/ExpoGaodeMapModule.swift +9 -4
  120. package/ios/map/ExpoGaodeMapView.swift +13 -2
  121. package/ios/map/modules/LocationManager.swift +17 -0
  122. package/ios/map/utils/PermissionManager.swift +11 -6
  123. package/ios/routes/drive/DriveTruckRouteCalculator.swift +9 -0
  124. package/ios/routes/walkride/WalkRideRouteCalculator.swift +30 -0
  125. package/ios/services/IndependentRouteService.swift +25 -0
  126. package/package.json +5 -2
@@ -6,6 +6,7 @@
6
6
  //
7
7
 
8
8
  import ExpoModulesCore
9
+ import UIKit
9
10
 
10
11
  public class ExpoGaodeMapNaviViewModule: Module {
11
12
  public func definition() -> ModuleDefinition {
@@ -27,7 +28,10 @@ public class ExpoGaodeMapNaviViewModule: Module {
27
28
  "onWayPointArrived",
28
29
  "onGpsStatusChanged",
29
30
  "onNavigationInfoUpdate",
30
- "onGpsSignalWeak"
31
+ "onGpsSignalWeak",
32
+ "onNavigationVisualStateUpdate",
33
+ "onLaneInfoUpdate",
34
+ "onTrafficStatusesUpdate"
31
35
  )
32
36
 
33
37
  // 属性定义
@@ -42,6 +46,30 @@ public class ExpoGaodeMapNaviViewModule: Module {
42
46
  Prop("showCamera") { (view: ExpoGaodeMapNaviView, value: Bool) in
43
47
  view.showCamera = value
44
48
  }
49
+
50
+ Prop("carImage") { (view: ExpoGaodeMapNaviView, value: String?) in
51
+ view.carImageSource = value
52
+ }
53
+
54
+ Prop("carCompassImage") { (view: ExpoGaodeMapNaviView, value: String?) in
55
+ view.carCompassImageSource = value
56
+ }
57
+
58
+ Prop("startPointImage") { (view: ExpoGaodeMapNaviView, value: String?) in
59
+ view.startPointImageSource = value
60
+ }
61
+
62
+ Prop("wayPointImage") { (view: ExpoGaodeMapNaviView, value: String?) in
63
+ view.wayPointImageSource = value
64
+ }
65
+
66
+ Prop("endPointImage") { (view: ExpoGaodeMapNaviView, value: String?) in
67
+ view.endPointImageSource = value
68
+ }
69
+
70
+ Prop("cameraImage") { (view: ExpoGaodeMapNaviView, value: String?) in
71
+ view.cameraImageSource = value
72
+ }
45
73
 
46
74
  Prop("autoLockCar") { (view: ExpoGaodeMapNaviView, value: Bool) in
47
75
  view.autoLockCar = value
@@ -83,6 +111,18 @@ public class ExpoGaodeMapNaviViewModule: Module {
83
111
  Prop("showTrafficBar") { (view: ExpoGaodeMapNaviView, value: Bool) in
84
112
  view.showTrafficBar = value
85
113
  }
114
+
115
+ Prop("trafficBarFrame") { (view: ExpoGaodeMapNaviView, value: [String: Double]?) in
116
+ let x = CGFloat(value?["x"] ?? 0)
117
+ let y = CGFloat(value?["y"] ?? 0)
118
+ let width = CGFloat(value?["width"] ?? 0)
119
+ let height = CGFloat(value?["height"] ?? 0)
120
+ view.trafficBarFrame = CGRect(x: x, y: y, width: width, height: height)
121
+ }
122
+
123
+ Prop("trafficBarColors") { (view: ExpoGaodeMapNaviView, value: [String: Any]?) in
124
+ view.trafficBarColors = value
125
+ }
86
126
 
87
127
  Prop("showBrowseRouteButton") { (view: ExpoGaodeMapNaviView, value: Bool) in
88
128
  view.showBrowseRouteButton = value
@@ -95,6 +135,14 @@ public class ExpoGaodeMapNaviViewModule: Module {
95
135
  Prop("showTrafficButton") { (view: ExpoGaodeMapNaviView, value: Bool) in
96
136
  view.showTrafficButton = value
97
137
  }
138
+
139
+ Prop("showBackupRoute") { (view: ExpoGaodeMapNaviView, value: Bool) in
140
+ view.showBackupRoute = value
141
+ }
142
+
143
+ Prop("showEagleMap") { (view: ExpoGaodeMapNaviView, value: Bool) in
144
+ view.showEagleMap = value
145
+ }
98
146
 
99
147
  Prop("showUIElements") { (view: ExpoGaodeMapNaviView, value: Bool) in
100
148
  view.applyShowUIElements(value)
@@ -111,6 +159,26 @@ public class ExpoGaodeMapNaviViewModule: Module {
111
159
  Prop("showTrafficLights") { (view: ExpoGaodeMapNaviView, value: Bool) in
112
160
  view.showTrafficLights = value
113
161
  }
162
+
163
+ Prop("showCompassEnabled") { (view: ExpoGaodeMapNaviView, value: Bool) in
164
+ view.showCompassEnabled = value
165
+ }
166
+
167
+ Prop("showDriveCongestion") { (view: ExpoGaodeMapNaviView, value: Bool) in
168
+ view.showDriveCongestion = value
169
+ }
170
+
171
+ Prop("showTrafficLightView") { (view: ExpoGaodeMapNaviView, value: Bool) in
172
+ view.showTrafficLightView = value
173
+ }
174
+
175
+ Prop("hideNativeTopInfoLayout") { (view: ExpoGaodeMapNaviView, value: Bool) in
176
+ view.hideNativeTopInfoLayout = value
177
+ }
178
+
179
+ Prop("hideNativeLaneInfoLayout") { (view: ExpoGaodeMapNaviView, value: Bool) in
180
+ view.hideNativeLaneInfoLayout = value
181
+ }
114
182
 
115
183
  Prop("mapViewModeType") { (view: ExpoGaodeMapNaviView, value: Int) in
116
184
  view.mapViewModeType = value
@@ -119,11 +187,29 @@ public class ExpoGaodeMapNaviViewModule: Module {
119
187
  Prop("lineWidth") { (view: ExpoGaodeMapNaviView, value: Double) in
120
188
  view.lineWidth = CGFloat(value)
121
189
  }
190
+
191
+ Prop("driveViewEdgePadding") { (view: ExpoGaodeMapNaviView, value: [String: Double]?) in
192
+ let top = CGFloat(value?["top"] ?? 0)
193
+ let left = CGFloat(value?["left"] ?? 0)
194
+ let bottom = CGFloat(value?["bottom"] ?? 0)
195
+ let right = CGFloat(value?["right"] ?? 0)
196
+ view.driveViewEdgePadding = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
197
+ }
198
+
199
+ Prop("screenAnchor") { (view: ExpoGaodeMapNaviView, value: [String: Double]?) in
200
+ let x = CGFloat(value?["x"] ?? 0)
201
+ let y = CGFloat(value?["y"] ?? 0)
202
+ view.screenAnchor = CGPoint(x: x, y: y)
203
+ }
122
204
 
123
205
  // 方法定义
124
206
  AsyncFunction("startNavigation") { (view: ExpoGaodeMapNaviView, startLat: Double, startLng: Double, endLat: Double, endLng: Double, promise: Promise) in
125
207
  view.startNavigation(startLat: startLat, startLng: startLng, endLat: endLat, endLng: endLng, promise: promise)
126
208
  }
209
+
210
+ AsyncFunction("startNavigationWithIndependentPath") { (view: ExpoGaodeMapNaviView, token: Int, routeId: Int?, routeIndex: Int?, naviType: Int?, promise: Promise) in
211
+ view.startNavigationWithIndependentPath(token: token, routeId: routeId, routeIndex: routeIndex, naviType: naviType, promise: promise)
212
+ }
127
213
 
128
214
  AsyncFunction("stopNavigation") { (view: ExpoGaodeMapNaviView, promise: Promise) in
129
215
  view.stopNavigation(promise: promise)
@@ -21,7 +21,7 @@ public class ExpoGaodeMapNavigationModule: Module {
21
21
  private var walkRideCalculator: WalkRideRouteCalculator?
22
22
 
23
23
  // 独立路径规划管理
24
- private let independentRouteManager = IndependentRouteManager()
24
+ private let independentRouteManager = IndependentRouteManager.shared
25
25
  private var independentRouteService: IndependentRouteService?
26
26
 
27
27
  // 官方导航组件(iOS)
@@ -10,6 +10,7 @@ import Foundation
10
10
  import AMapNaviKit
11
11
 
12
12
  class IndependentRouteManager {
13
+ static let shared = IndependentRouteManager()
13
14
 
14
15
  private var routeGroups: [Int: AMapNaviRouteGroup] = [:]
15
16
  private var nextToken: Int = 1
@@ -179,7 +179,7 @@ public class ExpoGaodeMapModule: Module {
179
179
 
180
180
  if status == .authorizedAlways || status == .authorizedWhenInUse {
181
181
  let manager = self.getLocationManager()
182
- manager.locationManager?.requestLocation(withReGeocode: manager.locationManager?.locatingWithReGeocode ?? true, completionBlock: { location, regeocode, error in
182
+ manager.requestSingleLocation { location, regeocode, error in
183
183
  if let error = error {
184
184
  promise.reject("LOCATION_ERROR", error.localizedDescription)
185
185
  return
@@ -213,7 +213,7 @@ public class ExpoGaodeMapModule: Module {
213
213
  }
214
214
 
215
215
  promise.resolve(locationData)
216
- })
216
+ }
217
217
  } else {
218
218
  promise.reject("LOCATION_ERROR", "location unauthorized")
219
219
  }
@@ -703,8 +703,13 @@ public class ExpoGaodeMapModule: Module {
703
703
  if self.permissionManager == nil {
704
704
  self.permissionManager = PermissionManager()
705
705
  }
706
-
707
- self.permissionManager?.requestPermission { granted, status in
706
+
707
+ guard let permissionManager = self.permissionManager else {
708
+ promise.reject("PERMISSION_MANAGER_INIT_FAILED", "权限管理器初始化失败")
709
+ return
710
+ }
711
+
712
+ permissionManager.requestPermission { _, _ in
708
713
  // 无论结果如何,都延迟后再次检查最终状态
709
714
  DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
710
715
  let finalStatus = self.currentAuthorizationStatus()
@@ -96,6 +96,8 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
96
96
  private var uiManager: UIManager!
97
97
  /// 地图是否已加载完成
98
98
  private var isMapLoaded = false
99
+ /// 初始相机是否已应用(仅应用一次,避免与运行时相机控制冲突)
100
+ private var hasAppliedInitialCameraPosition = false
99
101
  /// 是否正在处理 annotation 选择事件
100
102
  private var isHandlingAnnotationSelect = false
101
103
  /// MarkerView 的隐藏容器(用于渲染 children)
@@ -496,9 +498,10 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
496
498
 
497
499
  uiManager.setMapType(mapType)
498
500
 
499
- // 如果有初始位置,设置相机位置
500
- if let position = initialCameraPosition {
501
+ // initialCameraPosition 只应用一次,避免每次 props 更新重置相机导致操作延迟感
502
+ if !hasAppliedInitialCameraPosition, let position = initialCameraPosition {
501
503
  cameraManager.setInitialCameraPosition(position)
504
+ hasAppliedInitialCameraPosition = true
502
505
  }
503
506
 
504
507
  uiManager.setShowsScale(showsScale)
@@ -969,6 +972,8 @@ class ExpoGaodeMapView: ExpoView, MAMapViewDelegate, UIGestureRecognizerDelegate
969
972
 
970
973
  mapView = resolvedMapView
971
974
  super.addSubview(resolvedMapView)
975
+ isMapLoaded = false
976
+ hasAppliedInitialCameraPosition = false
972
977
 
973
978
  cameraManager = CameraManager(mapView: resolvedMapView)
974
979
  uiManager = UIManager(mapView: resolvedMapView)
@@ -1026,6 +1031,12 @@ extension ExpoGaodeMapView {
1026
1031
  public func mapViewDidFinishLoadingMap(_ mapView: MAMapView) {
1027
1032
  guard !isMapLoaded else { return }
1028
1033
  isMapLoaded = true
1034
+
1035
+ // 兜底:若初始化阶段尚未生效,在加载完成后应用一次初始相机
1036
+ if !hasAppliedInitialCameraPosition, let position = initialCameraPosition {
1037
+ cameraManager?.setInitialCameraPosition(position)
1038
+ hasAppliedInitialCameraPosition = true
1039
+ }
1029
1040
 
1030
1041
  // 地图加载完成后,应用自定义样式
1031
1042
  if let styleData = customMapStyleData {
@@ -112,6 +112,23 @@ class LocationManager: NSObject, AMapLocationManagerDelegate {
112
112
  ensureLocationManager()?.stopUpdatingHeading()
113
113
  }
114
114
 
115
+ func requestSingleLocation(completion: @escaping (_ location: CLLocation?, _ reGeocode: AMapLocationReGeocode?, _ error: Error?) -> Void) {
116
+ guard let manager = ensureLocationManager() else {
117
+ let error = NSError(
118
+ domain: "ExpoGaodeMap",
119
+ code: -1,
120
+ userInfo: [NSLocalizedDescriptionKey: "定位管理器未初始化,请先完成隐私协议确认"]
121
+ )
122
+ completion(nil, nil, error)
123
+ return
124
+ }
125
+
126
+ manager.requestLocation(
127
+ withReGeocode: manager.locatingWithReGeocode,
128
+ completionBlock: completion
129
+ )
130
+ }
131
+
115
132
  // MARK: - 初始化
116
133
 
117
134
  @discardableResult
@@ -48,17 +48,22 @@ class PermissionManager: NSObject, CLLocationManagerDelegate {
48
48
  self.permissionCallback = callback
49
49
 
50
50
  // 确保在主线程操作
51
- DispatchQueue.main.async { [weak self] in
52
- guard let self = self else { return }
53
-
51
+ DispatchQueue.main.async {
54
52
  if self.locationManager == nil {
55
53
  self.locationManager = CLLocationManager()
56
- self.locationManager?.delegate = self
57
54
  }
55
+
56
+ guard let locationManager = self.locationManager else {
57
+ self.permissionCallback?(false, "unknown")
58
+ self.permissionCallback = nil
59
+ return
60
+ }
61
+
62
+ locationManager.delegate = self
58
63
 
59
64
  var currentStatus: CLAuthorizationStatus
60
65
  if #available(iOS 14.0, *) {
61
- currentStatus = self.locationManager?.authorizationStatus ?? .notDetermined
66
+ currentStatus = locationManager.authorizationStatus
62
67
  } else {
63
68
  currentStatus = CLLocationManager.authorizationStatus()
64
69
  }
@@ -84,7 +89,7 @@ class PermissionManager: NSObject, CLLocationManagerDelegate {
84
89
  return
85
90
  }
86
91
 
87
- self.locationManager?.requestWhenInUseAuthorization()
92
+ locationManager.requestWhenInUseAuthorization()
88
93
  }
89
94
  }
90
95
 
@@ -36,11 +36,17 @@ class DriveTruckRouteCalculator: NSObject {
36
36
  isInitialized = true
37
37
  NSLog("DriveTruckRouteCalculator: AMapNaviDriveManager 初始化成功")
38
38
  }
39
+
40
+ private func bindDriveManagerDelegate() {
41
+ driveManager = AMapNaviDriveManager.sharedInstance()
42
+ driveManager?.delegate = self
43
+ }
39
44
 
40
45
  // MARK: - 驾车路径规划
41
46
 
42
47
  func calculateDriveRoute(options: [String: Any], promise: Promise) {
43
48
  NSLog("DriveTruckRouteCalculator: 开始计算驾车路线")
49
+ bindDriveManagerDelegate()
44
50
 
45
51
  // 防重复调用检查
46
52
  if currentPromise != nil {
@@ -138,6 +144,7 @@ class DriveTruckRouteCalculator: NSObject {
138
144
 
139
145
  func calculateTruckRoute(options: [String: Any], promise: Promise) {
140
146
  NSLog("DriveTruckRouteCalculator: 开始计算货车路线")
147
+ bindDriveManagerDelegate()
141
148
 
142
149
  // 设置货车车辆信息
143
150
  let vehicleInfo = AMapNaviVehicleInfo()
@@ -223,6 +230,7 @@ extension DriveTruckRouteCalculator: AMapNaviDriveManagerDelegate {
223
230
  if let naviRoutes = driveManager.naviRoutes {
224
231
  for (routeId, route) in naviRoutes {
225
232
  routes.append([
233
+ "id": routeId,
226
234
  "routeId": routeId,
227
235
  "distance": route.routeLength,
228
236
  "duration": route.routeTime,
@@ -234,6 +242,7 @@ extension DriveTruckRouteCalculator: AMapNaviDriveManagerDelegate {
234
242
  } else if let naviRoute = driveManager.naviRoute {
235
243
  // 单路线
236
244
  routes.append([
245
+ "id": 12,
237
246
  "routeId": 12,
238
247
  "distance": naviRoute.routeLength,
239
248
  "duration": naviRoute.routeTime,
@@ -38,10 +38,30 @@ class WalkRideRouteCalculator: NSObject {
38
38
  eleBikeDelegateHandler?.calculator = self
39
39
  eleBikeManager?.delegate = eleBikeDelegateHandler
40
40
  }
41
+
42
+ private func bindWalkManagerDelegate() {
43
+ walkManager = AMapNaviWalkManager.sharedInstance()
44
+ walkManager?.delegate = self
45
+ }
46
+
47
+ private func bindRideManagerDelegate() {
48
+ rideManager = AMapNaviRideManager.sharedInstance()
49
+ rideManager?.delegate = self
50
+ }
51
+
52
+ private func bindEleBikeManagerDelegate() {
53
+ eleBikeManager = AMapNaviEleBikeManager.sharedInstance()
54
+ if eleBikeDelegateHandler == nil {
55
+ eleBikeDelegateHandler = EleBikeDelegateHandler()
56
+ eleBikeDelegateHandler?.calculator = self
57
+ }
58
+ eleBikeManager?.delegate = eleBikeDelegateHandler
59
+ }
41
60
 
42
61
  // MARK: - 步行路径规划
43
62
 
44
63
  func calculateWalkRoute(options: [String: Any], promise: Promise) {
64
+ bindWalkManagerDelegate()
45
65
  guard let from = options["from"] as? [String: Any],
46
66
  let to = options["to"] as? [String: Any] else {
47
67
  promise.reject("INVALID_PARAMS", "from and to are required")
@@ -76,6 +96,7 @@ class WalkRideRouteCalculator: NSObject {
76
96
  /// 骑行路线规划(坐标方式)
77
97
  /// 对应官方方法:calculateRideRouteWithStartPoint:endPoint:
78
98
  func calculateRideRoute(options: [String: Any], promise: Promise) {
99
+ bindRideManagerDelegate()
79
100
  guard let from = options["from"] as? [String: Any],
80
101
  let to = options["to"] as? [String: Any] else {
81
102
  promise.reject("INVALID_PARAMS", "from and to are required")
@@ -104,6 +125,7 @@ class WalkRideRouteCalculator: NSObject {
104
125
  /// 骑行路线规划(POIInfo方式,推荐)
105
126
  /// 对应官方方法:calculateRideRouteWithStartPOIInfo:endPOIInfo:strategy:
106
127
  func calculateRideRouteWithPOI(options: [String: Any], promise: Promise) {
128
+ bindRideManagerDelegate()
107
129
  guard let to = options["to"] as? [String: Any] else {
108
130
  promise.reject("INVALID_PARAMS", "to is required")
109
131
  return
@@ -138,6 +160,7 @@ class WalkRideRouteCalculator: NSObject {
138
160
  /// 电动车路线规划(坐标方式)
139
161
  /// 对应官方方法:calculateEleBikeRouteWithStartPoint:endPoint:
140
162
  func calculateEleBikeRoute(options: [String: Any], promise: Promise) {
163
+ bindEleBikeManagerDelegate()
141
164
  guard let from = options["from"] as? [String: Any],
142
165
  let to = options["to"] as? [String: Any] else {
143
166
  promise.reject("INVALID_PARAMS", "from and to are required")
@@ -166,6 +189,7 @@ class WalkRideRouteCalculator: NSObject {
166
189
  /// 电动车路线规划(POIInfo方式,推荐)
167
190
  /// 对应官方方法:calculateEleBikeRouteWithStartPOIInfo:endPOIInfo:strategy:
168
191
  func calculateEleBikeRouteWithPOI(options: [String: Any], promise: Promise) {
192
+ bindEleBikeManagerDelegate()
169
193
  guard let to = options["to"] as? [String: Any] else {
170
194
  promise.reject("INVALID_PARAMS", "to is required")
171
195
  return
@@ -225,6 +249,7 @@ extension WalkRideRouteCalculator: AMapNaviWalkManagerDelegate {
225
249
  NSLog("WalkRideRouteCalculator: 步行规划返回 \(naviRoutes.count) 条路线")
226
250
  for (routeId, route) in naviRoutes {
227
251
  routes.append([
252
+ "id": routeId,
228
253
  "routeId": routeId,
229
254
  "distance": route.routeLength,
230
255
  "duration": route.routeTime,
@@ -236,6 +261,7 @@ extension WalkRideRouteCalculator: AMapNaviWalkManagerDelegate {
236
261
  // 单路线
237
262
  NSLog("WalkRideRouteCalculator: 步行规划返回单条路线")
238
263
  routes.append([
264
+ "id": 12,
239
265
  "routeId": 12,
240
266
  "distance": naviRoute.routeLength,
241
267
  "duration": naviRoute.routeTime,
@@ -274,6 +300,7 @@ extension WalkRideRouteCalculator: AMapNaviRideManagerDelegate {
274
300
  NSLog("WalkRideRouteCalculator: 骑行规划返回 \(naviRoutes.count) 条路线")
275
301
  for (routeId, route) in naviRoutes {
276
302
  routes.append([
303
+ "id": routeId,
277
304
  "routeId": routeId,
278
305
  "distance": route.routeLength,
279
306
  "duration": route.routeTime,
@@ -285,6 +312,7 @@ extension WalkRideRouteCalculator: AMapNaviRideManagerDelegate {
285
312
  // 单路线
286
313
  NSLog("WalkRideRouteCalculator: 骑行规划返回单条路线")
287
314
  routes.append([
315
+ "id": 12,
288
316
  "routeId": 12,
289
317
  "distance": naviRoute.routeLength,
290
318
  "duration": naviRoute.routeTime,
@@ -336,6 +364,7 @@ extension WalkRideRouteCalculator {
336
364
  NSLog("WalkRideRouteCalculator: 电动车规划返回 \(naviRoutes.count) 条路线")
337
365
  for (routeId, route) in naviRoutes {
338
366
  routes.append([
367
+ "id": routeId,
339
368
  "routeId": routeId,
340
369
  "distance": route.routeLength,
341
370
  "duration": route.routeTime,
@@ -347,6 +376,7 @@ extension WalkRideRouteCalculator {
347
376
  // 单路线
348
377
  NSLog("WalkRideRouteCalculator: 电动车规划返回单条路线")
349
378
  routes.append([
379
+ "id": 12,
350
380
  "routeId": 12,
351
381
  "distance": naviRoute.routeLength,
352
382
  "duration": naviRoute.routeTime,
@@ -40,9 +40,25 @@ class IndependentRouteService: NSObject {
40
40
  rideManager = AMapNaviRideManager.sharedInstance()
41
41
  rideManager?.delegate = self
42
42
  }
43
+
44
+ private func bindDriveManagerDelegate() {
45
+ driveManager = AMapNaviDriveManager.sharedInstance()
46
+ driveManager?.delegate = self
47
+ }
48
+
49
+ private func bindWalkManagerDelegate() {
50
+ walkManager = AMapNaviWalkManager.sharedInstance()
51
+ walkManager?.delegate = self
52
+ }
53
+
54
+ private func bindRideManagerDelegate() {
55
+ rideManager = AMapNaviRideManager.sharedInstance()
56
+ rideManager?.delegate = self
57
+ }
43
58
 
44
59
  // MARK: - 独立驾车路线规划
45
60
  func independentDriveRoute(options: [String: Any], promise: Promise) {
61
+ bindDriveManagerDelegate()
46
62
  guard let from = options["from"] as? [String: Any],
47
63
  let to = options["to"] as? [String: Any] else {
48
64
  promise.reject("INVALID_PARAMS", "from and to are required")
@@ -98,6 +114,7 @@ class IndependentRouteService: NSObject {
98
114
 
99
115
  // MARK: - 独立货车路线规划
100
116
  func independentTruckRoute(options: [String: Any], promise: Promise) {
117
+ bindDriveManagerDelegate()
101
118
  var truckOptions = options
102
119
  if truckOptions["carType"] == nil && (truckOptions["vehicleInfo"] as? [String: Any]) == nil {
103
120
  truckOptions["carType"] = 1
@@ -107,6 +124,7 @@ class IndependentRouteService: NSObject {
107
124
 
108
125
  // MARK: - 独立步行路线规划
109
126
  func independentWalkRoute(options: [String: Any], promise: Promise) {
127
+ bindWalkManagerDelegate()
110
128
  guard let from = options["from"] as? [String: Any],
111
129
  let to = options["to"] as? [String: Any] else {
112
130
  promise.reject("INVALID_PARAMS", "from and to are required")
@@ -134,6 +152,7 @@ class IndependentRouteService: NSObject {
134
152
 
135
153
  // MARK: - 独立骑行路线规划
136
154
  func independentRideRoute(options: [String: Any], promise: Promise) {
155
+ bindRideManagerDelegate()
137
156
  guard let from = options["from"] as? [String: Any],
138
157
  let to = options["to"] as? [String: Any] else {
139
158
  promise.reject("INVALID_PARAMS", "from and to are required")
@@ -161,6 +180,7 @@ class IndependentRouteService: NSObject {
161
180
 
162
181
  // MARK: - 独立摩托车路线规划(使用驾车接口)
163
182
  func independentMotorcycleRoute(options: [String: Any], promise: Promise) {
183
+ bindDriveManagerDelegate()
164
184
  var motorcycleOptions = options
165
185
  if motorcycleOptions["carType"] == nil {
166
186
  motorcycleOptions["carType"] = 11
@@ -254,6 +274,7 @@ class IndependentRouteService: NSObject {
254
274
  let key = NSNumber(value: routeId)
255
275
  guard let route = naviRoutes[key] else { continue }
256
276
  routes.append([
277
+ "id": routeId,
257
278
  "routeId": routeId,
258
279
  "distance": route.routeLength,
259
280
  "duration": route.routeTime,
@@ -265,6 +286,7 @@ class IndependentRouteService: NSObject {
265
286
  } else if let route = routeGroup.naviRoute {
266
287
  let routeId = routeGroup.naviRouteID
267
288
  routes.append([
289
+ "id": routeId,
268
290
  "routeId": routeId,
269
291
  "distance": route.routeLength,
270
292
  "duration": route.routeTime,
@@ -326,6 +348,7 @@ extension IndependentRouteService: AMapNaviDriveManagerDelegate {
326
348
  for routeID in routeIDs {
327
349
  if let route = driveManager.naviRoutes?[routeID] {
328
350
  routes.append([
351
+ "id": routeID.intValue,
329
352
  "routeId": routeID.intValue,
330
353
  "distance": route.routeLength,
331
354
  "duration": route.routeTime,
@@ -365,6 +388,7 @@ extension IndependentRouteService: AMapNaviWalkManagerDelegate {
365
388
  var routes: [[String: Any]] = []
366
389
  if let naviRoute = walkManager.naviRoute {
367
390
  routes.append([
391
+ "id": 1,
368
392
  "routeId": 1,
369
393
  "distance": naviRoute.routeLength,
370
394
  "duration": naviRoute.routeTime,
@@ -401,6 +425,7 @@ extension IndependentRouteService: AMapNaviRideManagerDelegate {
401
425
  var routes: [[String: Any]] = []
402
426
  if let naviRoute = rideManager.naviRoute {
403
427
  routes.append([
428
+ "id": 1,
404
429
  "routeId": 1,
405
430
  "distance": naviRoute.routeLength,
406
431
  "duration": naviRoute.routeTime,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-gaode-map-navigation",
3
- "version": "2.0.8",
3
+ "version": "2.0.9",
4
4
  "description": "React Native AMap (Gaode Map) navigation module for Expo: route planning and turn-by-turn navigation, includes full map features.",
5
5
  "author": "TomWq <582752848@qq.com> (https://github.com/TomWq)",
6
6
  "repository": {
@@ -23,6 +23,7 @@
23
23
  "ios": "expo run:ios"
24
24
  },
25
25
  "devDependencies": {
26
+ "@expo/vector-icons": "^15.0.3",
26
27
  "@types/react": "~19.1.0",
27
28
  "expo": "^54.0.31",
28
29
  "expo-module-scripts": "^5.0.8",
@@ -30,9 +31,11 @@
30
31
  "typescript": "^5.9.3"
31
32
  },
32
33
  "peerDependencies": {
34
+ "@expo/vector-icons": "*",
33
35
  "expo": "*",
34
36
  "react": "*",
35
- "react-native": "*"
37
+ "react-native": "*",
38
+ "react-native-safe-area-context": "*"
36
39
  },
37
40
  "peerDependenciesMeta": {
38
41
  "expo": {