expo-gaode-map-navigation 2.0.12-next.0 → 2.0.13

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 (238) hide show
  1. package/README.md +296 -7
  2. package/android/build.gradle +12 -4
  3. package/android/src/main/AndroidManifest.xml +10 -1
  4. package/android/src/main/cpp/cluster_jni.cpp +56 -0
  5. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapModule.kt +49 -8
  6. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapOfflineModule.kt +83 -15
  7. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapView.kt +13 -3
  8. package/android/src/main/java/expo/modules/gaodemap/map/managers/UIManager.kt +36 -39
  9. package/android/src/main/java/expo/modules/gaodemap/map/modules/SDKInitializer.kt +23 -17
  10. package/android/src/main/java/expo/modules/gaodemap/map/overlays/ClusterView.kt +5 -2
  11. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapView.kt +122 -10
  12. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapViewModule.kt +2 -2
  13. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerView.kt +37 -25
  14. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerViewModule.kt +6 -6
  15. package/android/src/main/java/expo/modules/gaodemap/map/search/ExpoGaodeMapSearchModule.kt +751 -0
  16. package/android/src/main/java/expo/modules/gaodemap/map/utils/GeometryUtils.kt +103 -0
  17. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviView.kt +1408 -394
  18. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviViewModule.kt +121 -1
  19. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNavigationModule.kt +14 -28
  20. package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/IndependentRouteListener.kt +28 -3
  21. package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/RouteCalculateListener.kt +2 -2
  22. package/android/src/main/java/expo/modules/gaodemap/navigation/managers/IndependentRouteManager.kt +114 -15
  23. package/android/src/main/java/expo/modules/gaodemap/navigation/routes/drive/DriveTruckRouteCalculator.kt +24 -35
  24. package/android/src/main/java/expo/modules/gaodemap/navigation/services/IndependentRouteService.kt +50 -36
  25. package/android/src/main/java/expo/modules/gaodemap/navigation/services/NavigationForegroundService.kt +661 -0
  26. package/android/src/main/java/expo/modules/gaodemap/navigation/utils/Converters.kt +21 -12
  27. package/android/src/main/res/drawable/ic_nav_notification_small.xml +10 -0
  28. package/android/src/main/res/drawable/landback_0.png +0 -0
  29. package/android/src/main/res/drawable/landback_1.png +0 -0
  30. package/android/src/main/res/drawable/landback_2.png +0 -0
  31. package/android/src/main/res/drawable/landback_3.png +0 -0
  32. package/android/src/main/res/drawable/landback_4.png +0 -0
  33. package/android/src/main/res/drawable/landback_5.png +0 -0
  34. package/android/src/main/res/drawable/landback_6.png +0 -0
  35. package/android/src/main/res/drawable/landback_7.png +0 -0
  36. package/android/src/main/res/drawable/landback_8.png +0 -0
  37. package/android/src/main/res/drawable/landback_9.png +0 -0
  38. package/android/src/main/res/drawable/landback_a.png +0 -0
  39. package/android/src/main/res/drawable/landback_b.png +0 -0
  40. package/android/src/main/res/drawable/landback_c.png +0 -0
  41. package/android/src/main/res/drawable/landback_d.png +0 -0
  42. package/android/src/main/res/drawable/landback_e.png +0 -0
  43. package/android/src/main/res/drawable/landback_f.png +0 -0
  44. package/android/src/main/res/drawable/landback_g.png +0 -0
  45. package/android/src/main/res/drawable/landback_h.png +0 -0
  46. package/android/src/main/res/drawable/landback_i.png +0 -0
  47. package/android/src/main/res/drawable/landback_j.png +0 -0
  48. package/android/src/main/res/drawable/landback_k.png +0 -0
  49. package/android/src/main/res/drawable/landback_l.png +0 -0
  50. package/android/src/main/res/drawable/landfront_0.png +0 -0
  51. package/android/src/main/res/drawable/landfront_00.png +0 -0
  52. package/android/src/main/res/drawable/landfront_1.png +0 -0
  53. package/android/src/main/res/drawable/landfront_11.png +0 -0
  54. package/android/src/main/res/drawable/landfront_20.png +0 -0
  55. package/android/src/main/res/drawable/landfront_21.png +0 -0
  56. package/android/src/main/res/drawable/landfront_22.png +0 -0
  57. package/android/src/main/res/drawable/landfront_3.png +0 -0
  58. package/android/src/main/res/drawable/landfront_33.png +0 -0
  59. package/android/src/main/res/drawable/landfront_40.png +0 -0
  60. package/android/src/main/res/drawable/landfront_43.png +0 -0
  61. package/android/src/main/res/drawable/landfront_44.png +0 -0
  62. package/android/src/main/res/drawable/landfront_5.png +0 -0
  63. package/android/src/main/res/drawable/landfront_55.png +0 -0
  64. package/android/src/main/res/drawable/landfront_61.png +0 -0
  65. package/android/src/main/res/drawable/landfront_63.png +0 -0
  66. package/android/src/main/res/drawable/landfront_66.png +0 -0
  67. package/android/src/main/res/drawable/landfront_70.png +0 -0
  68. package/android/src/main/res/drawable/landfront_71.png +0 -0
  69. package/android/src/main/res/drawable/landfront_73.png +0 -0
  70. package/android/src/main/res/drawable/landfront_77.png +0 -0
  71. package/android/src/main/res/drawable/landfront_8.png +0 -0
  72. package/android/src/main/res/drawable/landfront_88.png +0 -0
  73. package/android/src/main/res/drawable/landfront_90.png +0 -0
  74. package/android/src/main/res/drawable/landfront_95.png +0 -0
  75. package/android/src/main/res/drawable/landfront_99.png +0 -0
  76. package/android/src/main/res/drawable/landfront_a0.png +0 -0
  77. package/android/src/main/res/drawable/landfront_a8.png +0 -0
  78. package/android/src/main/res/drawable/landfront_aa.png +0 -0
  79. package/android/src/main/res/drawable/landfront_b1.png +0 -0
  80. package/android/src/main/res/drawable/landfront_b5.png +0 -0
  81. package/android/src/main/res/drawable/landfront_bb.png +0 -0
  82. package/android/src/main/res/drawable/landfront_c3.png +0 -0
  83. package/android/src/main/res/drawable/landfront_c8.png +0 -0
  84. package/android/src/main/res/drawable/landfront_cc.png +0 -0
  85. package/android/src/main/res/drawable/landfront_d.png +0 -0
  86. package/android/src/main/res/drawable/landfront_dd.png +0 -0
  87. package/android/src/main/res/drawable/landfront_e1.png +0 -0
  88. package/android/src/main/res/drawable/landfront_e5.png +0 -0
  89. package/android/src/main/res/drawable/landfront_ee.png +0 -0
  90. package/android/src/main/res/drawable/landfront_f0.png +0 -0
  91. package/android/src/main/res/drawable/landfront_f1.png +0 -0
  92. package/android/src/main/res/drawable/landfront_f5.png +0 -0
  93. package/android/src/main/res/drawable/landfront_ff.png +0 -0
  94. package/android/src/main/res/drawable/landfront_g3.png +0 -0
  95. package/android/src/main/res/drawable/landfront_g5.png +0 -0
  96. package/android/src/main/res/drawable/landfront_gg.png +0 -0
  97. package/android/src/main/res/drawable/landfront_h1.png +0 -0
  98. package/android/src/main/res/drawable/landfront_h3.png +0 -0
  99. package/android/src/main/res/drawable/landfront_h5.png +0 -0
  100. package/android/src/main/res/drawable/landfront_hh.png +0 -0
  101. package/android/src/main/res/drawable/landfront_i0.png +0 -0
  102. package/android/src/main/res/drawable/landfront_i3.png +0 -0
  103. package/android/src/main/res/drawable/landfront_i5.png +0 -0
  104. package/android/src/main/res/drawable/landfront_ii.png +0 -0
  105. package/android/src/main/res/drawable/landfront_j1.png +0 -0
  106. package/android/src/main/res/drawable/landfront_j8.png +0 -0
  107. package/android/src/main/res/drawable/landfront_jj.png +0 -0
  108. package/android/src/main/res/drawable/landfront_kk.png +0 -0
  109. package/android/src/main/res/drawable/landfront_ll.png +0 -0
  110. package/android/src/main/res/drawable/nav_notification_brand_icon.xml +16 -0
  111. package/android/src/main/res/drawable/navi_arrow_leftline.png +0 -0
  112. package/android/src/main/res/drawable/navi_lane_shape_bg_center.xml +5 -0
  113. package/android/src/main/res/drawable/navi_lane_shape_bg_left.xml +8 -0
  114. package/android/src/main/res/drawable/navi_lane_shape_bg_over.xml +6 -0
  115. package/android/src/main/res/drawable/navi_lane_shape_bg_right.xml +8 -0
  116. package/android/src/main/res/drawable-nodpi/nav_tracker_car.png +0 -0
  117. package/build/ExpoGaodeMapNaviView.d.ts +16 -0
  118. package/build/ExpoGaodeMapNaviView.d.ts.map +1 -1
  119. package/build/ExpoGaodeMapNaviView.js +74 -1
  120. package/build/ExpoGaodeMapNaviView.js.map +1 -1
  121. package/build/index.d.ts +56 -8
  122. package/build/index.d.ts.map +1 -1
  123. package/build/index.js +452 -10
  124. package/build/index.js.map +1 -1
  125. package/build/map/ExpoGaodeMapModule.d.ts +15 -13
  126. package/build/map/ExpoGaodeMapModule.d.ts.map +1 -1
  127. package/build/map/ExpoGaodeMapModule.js +31 -39
  128. package/build/map/ExpoGaodeMapModule.js.map +1 -1
  129. package/build/map/ExpoGaodeMapOfflineModule.d.ts +5 -0
  130. package/build/map/ExpoGaodeMapOfflineModule.d.ts.map +1 -1
  131. package/build/map/ExpoGaodeMapOfflineModule.js.map +1 -1
  132. package/build/map/ExpoGaodeMapView.d.ts +3 -4
  133. package/build/map/ExpoGaodeMapView.d.ts.map +1 -1
  134. package/build/map/ExpoGaodeMapView.js +28 -25
  135. package/build/map/ExpoGaodeMapView.js.map +1 -1
  136. package/build/map/components/overlays/Circle.d.ts.map +1 -1
  137. package/build/map/components/overlays/Circle.js +1 -30
  138. package/build/map/components/overlays/Circle.js.map +1 -1
  139. package/build/map/components/overlays/Cluster.d.ts.map +1 -1
  140. package/build/map/components/overlays/Cluster.js +1 -42
  141. package/build/map/components/overlays/Cluster.js.map +1 -1
  142. package/build/map/components/overlays/HeatMap.d.ts.map +1 -1
  143. package/build/map/components/overlays/HeatMap.js +21 -21
  144. package/build/map/components/overlays/HeatMap.js.map +1 -1
  145. package/build/map/components/overlays/Marker.d.ts.map +1 -1
  146. package/build/map/components/overlays/Marker.js +76 -80
  147. package/build/map/components/overlays/Marker.js.map +1 -1
  148. package/build/map/components/overlays/Polygon.d.ts.map +1 -1
  149. package/build/map/components/overlays/Polygon.js +1 -25
  150. package/build/map/components/overlays/Polygon.js.map +1 -1
  151. package/build/map/components/overlays/Polyline.d.ts.map +1 -1
  152. package/build/map/components/overlays/Polyline.js +1 -31
  153. package/build/map/components/overlays/Polyline.js.map +1 -1
  154. package/build/map/index.d.ts +9 -2
  155. package/build/map/index.d.ts.map +1 -1
  156. package/build/map/index.js +9 -2
  157. package/build/map/index.js.map +1 -1
  158. package/build/map/search/ExpoGaodeMapSearch.types.d.ts +340 -0
  159. package/build/map/search/ExpoGaodeMapSearch.types.d.ts.map +1 -0
  160. package/build/map/search/ExpoGaodeMapSearch.types.js +19 -0
  161. package/build/map/search/ExpoGaodeMapSearch.types.js.map +1 -0
  162. package/build/map/search/ExpoGaodeMapSearchModule.d.ts +74 -0
  163. package/build/map/search/ExpoGaodeMapSearchModule.d.ts.map +1 -0
  164. package/build/map/search/ExpoGaodeMapSearchModule.js +47 -0
  165. package/build/map/search/ExpoGaodeMapSearchModule.js.map +1 -0
  166. package/build/map/search/index.d.ts +156 -0
  167. package/build/map/search/index.d.ts.map +1 -0
  168. package/build/map/search/index.js +171 -0
  169. package/build/map/search/index.js.map +1 -0
  170. package/build/map/types/index.d.ts +2 -2
  171. package/build/map/types/index.d.ts.map +1 -1
  172. package/build/map/types/index.js.map +1 -1
  173. package/build/map/types/map-view.types.d.ts +4 -2
  174. package/build/map/types/map-view.types.d.ts.map +1 -1
  175. package/build/map/types/map-view.types.js.map +1 -1
  176. package/build/map/types/native-module.types.d.ts +11 -12
  177. package/build/map/types/native-module.types.d.ts.map +1 -1
  178. package/build/map/types/native-module.types.js.map +1 -1
  179. package/build/map/types/overlays.types.d.ts +9 -14
  180. package/build/map/types/overlays.types.d.ts.map +1 -1
  181. package/build/map/types/overlays.types.js.map +1 -1
  182. package/build/map/types/route-playback.types.d.ts +16 -0
  183. package/build/map/types/route-playback.types.d.ts.map +1 -1
  184. package/build/map/types/route-playback.types.js.map +1 -1
  185. package/build/map/utils/ErrorHandler.js +11 -11
  186. package/build/map/utils/ErrorHandler.js.map +1 -1
  187. package/build/map/utils/OfflineMapManager.d.ts +4 -0
  188. package/build/map/utils/OfflineMapManager.d.ts.map +1 -1
  189. package/build/map/utils/OfflineMapManager.js +6 -0
  190. package/build/map/utils/OfflineMapManager.js.map +1 -1
  191. package/build/types/coordinates.types.d.ts +3 -0
  192. package/build/types/coordinates.types.d.ts.map +1 -1
  193. package/build/types/coordinates.types.js.map +1 -1
  194. package/build/types/independent.types.d.ts +111 -12
  195. package/build/types/independent.types.d.ts.map +1 -1
  196. package/build/types/independent.types.js.map +1 -1
  197. package/build/types/native-module.types.d.ts +1 -1
  198. package/build/types/native-module.types.js.map +1 -1
  199. package/build/types/naviview.types.d.ts +304 -14
  200. package/build/types/naviview.types.d.ts.map +1 -1
  201. package/build/types/naviview.types.js.map +1 -1
  202. package/build/types/route.types.d.ts +12 -2
  203. package/build/types/route.types.d.ts.map +1 -1
  204. package/build/types/route.types.js.map +1 -1
  205. package/expo-module.config.json +4 -2
  206. package/ios/ExpoGaodeMapNaviView.swift +2331 -201
  207. package/ios/ExpoGaodeMapNaviViewModule.swift +109 -1
  208. package/ios/ExpoGaodeMapNavigation.podspec +2 -1
  209. package/ios/ExpoGaodeMapNavigationModule.swift +7 -5
  210. package/ios/managers/IndependentRouteManager.swift +90 -26
  211. package/ios/map/ExpoGaodeMapModule.swift +72 -21
  212. package/ios/map/ExpoGaodeMapOfflineModule.swift +61 -0
  213. package/ios/map/ExpoGaodeMapSearchModule.swift +773 -0
  214. package/ios/map/ExpoGaodeMapView.swift +23 -5
  215. package/ios/map/GaodeMapPrivacyManager.swift +26 -18
  216. package/ios/map/cpp/GeometryEngine.cpp +112 -0
  217. package/ios/map/cpp/GeometryEngine.hpp +21 -0
  218. package/ios/map/modules/LocationManager.swift +37 -5
  219. package/ios/map/overlays/MarkerView.swift +11 -11
  220. package/ios/map/overlays/MarkerViewModule.swift +4 -4
  221. package/ios/map/overlays/PolylineView.swift +6 -12
  222. package/ios/map/utils/ClusterNative.h +8 -0
  223. package/ios/map/utils/ClusterNative.mm +27 -0
  224. package/ios/map/utils/PermissionManager.swift +115 -6
  225. package/ios/routes/drive/DriveTruckRouteCalculator.swift +165 -77
  226. package/ios/routes/walkride/WalkRideRouteCalculator.swift +127 -1
  227. package/ios/services/IndependentRouteService.swift +198 -39
  228. package/ios/services/NavigationLiveActivityAttributes.swift +48 -0
  229. package/ios/services/NavigationLiveActivityManager.swift +359 -0
  230. package/package.json +22 -7
  231. package/plugin/build/withGaodeMap.d.ts +8 -0
  232. package/plugin/build/withGaodeMap.js +60 -4
  233. package/scripts/check-expo-modules.js +68 -0
  234. package/shared/cpp/GeometryEngine.cpp +112 -0
  235. package/shared/cpp/GeometryEngine.hpp +21 -0
  236. package/widget-template/README.md +46 -0
  237. package/widget-template/ios/NavigationLiveActivityWidget.swift +367 -0
  238. package/android/src/main/java/expo/modules/gaodemap/navigation/managers/RouteCalculator.kt +0 -173
@@ -40,18 +40,35 @@ 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) {
46
- guard let from = options["from"] as? [String: Any],
47
- let to = options["to"] as? [String: Any] else {
48
- promise.reject("INVALID_PARAMS", "from and to are required")
61
+ bindDriveManagerDelegate()
62
+ guard let to = options["to"] as? [String: Any] else {
63
+ promise.reject("INVALID_PARAMS", "to is required")
49
64
  return
50
65
  }
51
66
 
52
- guard let startPOIInfo = Converters.parseNaviPOIInfo(from),
53
- let endPOIInfo = Converters.parseNaviPOIInfo(to) else {
54
- promise.reject("INVALID_COORDS", "Invalid coordinates or POI info")
67
+ let from = options["from"] as? [String: Any]
68
+ let startPOIInfo = Converters.parseNaviPOIInfo(from)
69
+
70
+ guard let endPOIInfo = Converters.parseNaviPOIInfo(to) else {
71
+ promise.reject("INVALID_COORDS", "Invalid destination coordinates or POI info")
55
72
  return
56
73
  }
57
74
 
@@ -66,7 +83,7 @@ class IndependentRouteService: NSObject {
66
83
 
67
84
  let strategyValue = resolveDriveStrategyValue(options: options)
68
85
  let strategy = AMapNaviDrivingStrategy(rawValue: strategyValue)
69
- ?? AMapNaviDrivingStrategy.drivingStrategySingleDefault
86
+ ?? AMapNaviDrivingStrategy.drivingStrategyMultipleDefault
70
87
  let token = independentRouteManager.generateToken()
71
88
 
72
89
  let success = driveManager?.independentCalculateDriveRoute(
@@ -98,6 +115,7 @@ class IndependentRouteService: NSObject {
98
115
 
99
116
  // MARK: - 独立货车路线规划
100
117
  func independentTruckRoute(options: [String: Any], promise: Promise) {
118
+ bindDriveManagerDelegate()
101
119
  var truckOptions = options
102
120
  if truckOptions["carType"] == nil && (truckOptions["vehicleInfo"] as? [String: Any]) == nil {
103
121
  truckOptions["carType"] = 1
@@ -107,60 +125,117 @@ class IndependentRouteService: NSObject {
107
125
 
108
126
  // MARK: - 独立步行路线规划
109
127
  func independentWalkRoute(options: [String: Any], promise: Promise) {
110
- guard let from = options["from"] as? [String: Any],
111
- let to = options["to"] as? [String: Any] else {
112
- promise.reject("INVALID_PARAMS", "from and to are required")
128
+ bindWalkManagerDelegate()
129
+ guard let to = options["to"] as? [String: Any] else {
130
+ promise.reject("INVALID_PARAMS", "to is required")
113
131
  return
114
132
  }
115
-
116
- guard let startPoint = Converters.parseNaviPoint(from),
117
- let endPoint = Converters.parseNaviPoint(to) else {
118
- promise.reject("INVALID_COORDS", "Invalid coordinates")
133
+
134
+ let from = options["from"] as? [String: Any]
135
+ let startPOIInfo = Converters.parseNaviPOIInfo(from)
136
+
137
+ guard let endPOIInfo = Converters.parseNaviPOIInfo(to) else {
138
+ promise.reject("INVALID_COORDS", "Invalid destination coordinates or POI info")
119
139
  return
120
140
  }
121
-
122
- currentScene = "walk"
123
- currentPromise = promise
124
- currentToken = independentRouteManager.generateToken()
125
-
126
- let success = walkManager?.calculateWalkRoute(withStart: [startPoint], end: [endPoint]) ?? false
127
-
141
+
142
+ let wayPOIInfos: [AMapNaviPOIInfo]? = {
143
+ guard let waypoints = options["waypoints"] as? [[String: Any]] else { return nil }
144
+ return Converters.parseNaviPOIInfos(waypoints)
145
+ }()
146
+
147
+ let strategy = resolveTravelStrategy(options: options)
148
+ let token = independentRouteManager.generateToken()
149
+
150
+ let success = walkManager?.independentCalculateWalkRoute(
151
+ withStart: startPOIInfo,
152
+ end: endPOIInfo,
153
+ wayPOIInfos: wayPOIInfos,
154
+ strategy: strategy,
155
+ callback: { [weak self] routeGroup, error in
156
+ guard let self else { return }
157
+ if let error = error {
158
+ promise.reject("CALCULATE_FAILED", error.localizedDescription)
159
+ return
160
+ }
161
+ guard let routeGroup = routeGroup else {
162
+ promise.reject("CALCULATE_FAILED", "独立步行算路成功回调未返回 routeGroup")
163
+ return
164
+ }
165
+
166
+ self.independentRouteManager.storeRouteGroup(token: token, scene: "walk", routeGroup: routeGroup)
167
+ let result = self.convertIndependentTravelResult(
168
+ routeGroup: routeGroup,
169
+ token: token,
170
+ scene: "walk"
171
+ )
172
+ promise.resolve(result)
173
+ }
174
+ ) ?? false
175
+
128
176
  if !success {
129
- currentPromise = nil
130
- currentToken = nil
131
177
  promise.reject("CALCULATE_FAILED", "独立步行路线规划启动失败")
132
178
  }
133
179
  }
134
180
 
135
181
  // MARK: - 独立骑行路线规划
136
182
  func independentRideRoute(options: [String: Any], promise: Promise) {
137
- guard let from = options["from"] as? [String: Any],
138
- let to = options["to"] as? [String: Any] else {
139
- promise.reject("INVALID_PARAMS", "from and to are required")
183
+ bindRideManagerDelegate()
184
+ guard let to = options["to"] as? [String: Any] else {
185
+ promise.reject("INVALID_PARAMS", "to is required")
140
186
  return
141
187
  }
142
-
143
- guard let startPoint = Converters.parseNaviPoint(from),
144
- let endPoint = Converters.parseNaviPoint(to) else {
145
- promise.reject("INVALID_COORDS", "Invalid coordinates")
188
+
189
+ let from = options["from"] as? [String: Any]
190
+ let startPOIInfo = Converters.parseNaviPOIInfo(from)
191
+
192
+ guard let endPOIInfo = Converters.parseNaviPOIInfo(to) else {
193
+ promise.reject("INVALID_COORDS", "Invalid destination coordinates or POI info")
146
194
  return
147
195
  }
148
-
149
- currentScene = "ride"
150
- currentPromise = promise
151
- currentToken = independentRouteManager.generateToken()
152
-
153
- let success = rideManager?.calculateRideRoute(withStart: startPoint, end: endPoint) ?? false
154
-
196
+
197
+ let wayPOIInfos: [AMapNaviPOIInfo]? = {
198
+ guard let waypoints = options["waypoints"] as? [[String: Any]] else { return nil }
199
+ return Converters.parseNaviPOIInfos(waypoints)
200
+ }()
201
+
202
+ let strategy = resolveTravelStrategy(options: options)
203
+ let token = independentRouteManager.generateToken()
204
+
205
+ let success = rideManager?.independentCalculateRideRoute(
206
+ withStart: startPOIInfo,
207
+ end: endPOIInfo,
208
+ wayPOIInfos: wayPOIInfos ?? [],
209
+ strategy: strategy,
210
+ callback: { [weak self] routeGroup, error in
211
+ guard let self else { return }
212
+ if let error = error {
213
+ promise.reject("CALCULATE_FAILED", error.localizedDescription)
214
+ return
215
+ }
216
+ guard let routeGroup = routeGroup else {
217
+ promise.reject("CALCULATE_FAILED", "独立骑行算路成功回调未返回 routeGroup")
218
+ return
219
+ }
220
+
221
+ self.independentRouteManager.storeRouteGroup(token: token, scene: "ride", routeGroup: routeGroup)
222
+ let result = self.convertIndependentTravelResult(
223
+ routeGroup: routeGroup,
224
+ token: token,
225
+ scene: "ride"
226
+ )
227
+ promise.resolve(result)
228
+ }
229
+ ) ?? false
230
+
155
231
  if !success {
156
- currentPromise = nil
157
- currentToken = nil
158
232
  promise.reject("CALCULATE_FAILED", "独立骑行路线规划启动失败")
159
233
  }
160
234
  }
161
235
 
162
236
  // MARK: - 独立摩托车路线规划(使用驾车接口)
163
237
  func independentMotorcycleRoute(options: [String: Any], promise: Promise) {
238
+ bindDriveManagerDelegate()
164
239
  var motorcycleOptions = options
165
240
  if motorcycleOptions["carType"] == nil {
166
241
  motorcycleOptions["carType"] = 11
@@ -240,6 +315,82 @@ class IndependentRouteService: NSObject {
240
315
  return hasAnyValue ? naviVehicleInfo : nil
241
316
  }
242
317
 
318
+ private func resolveTravelStrategy(options: [String: Any]) -> AMapNaviTravelStrategy {
319
+ if let rawValue = intValue(options["travelStrategy"]),
320
+ let strategy = AMapNaviTravelStrategy(rawValue: rawValue) {
321
+ return strategy
322
+ }
323
+
324
+ if (options["multiple"] as? Bool) == true {
325
+ return .multipleDefault
326
+ }
327
+
328
+ return .singleDefault
329
+ }
330
+
331
+ private func convertIndependentTravelResult(
332
+ routeGroup: AMapNaviRouteGroup,
333
+ token: Int,
334
+ scene: String
335
+ ) -> [String: Any] {
336
+ let orderedRouteIds = routeGroup.naviRouteIDs?.map { $0.intValue } ?? []
337
+ var routes: [[String: Any]] = []
338
+
339
+ if let naviRoutes = routeGroup.naviRoutes {
340
+ let fallbackIds = naviRoutes.keys.map { $0.intValue }.sorted()
341
+ let routeIds = orderedRouteIds.isEmpty ? fallbackIds : orderedRouteIds
342
+ for routeId in routeIds {
343
+ let key = NSNumber(value: routeId)
344
+ guard let route = naviRoutes[key] else { continue }
345
+ routes.append([
346
+ "id": routeId,
347
+ "routeId": routeId,
348
+ "distance": route.routeLength,
349
+ "duration": route.routeTime,
350
+ "strategy": buildTravelRouteStrategyLabel(scene: scene, routeId: routeId),
351
+ "polyline": extractCoordinates(from: route)
352
+ ])
353
+ }
354
+ } else if let route = routeGroup.naviRoute {
355
+ let routeId = routeGroup.naviRouteID
356
+ routes.append([
357
+ "id": routeId,
358
+ "routeId": routeId,
359
+ "distance": route.routeLength,
360
+ "duration": route.routeTime,
361
+ "strategy": scene == "ride" ? "骑行路线" : "步行路线",
362
+ "polyline": extractCoordinates(from: route)
363
+ ])
364
+ }
365
+
366
+ let finalRouteIds = orderedRouteIds.isEmpty ? routes.compactMap { $0["routeId"] as? Int } : orderedRouteIds
367
+ let mainRouteId = routeGroup.naviRouteID
368
+ let mainPathIndex = finalRouteIds.firstIndex(of: mainRouteId) ?? 0
369
+
370
+ return [
371
+ "success": true,
372
+ "independent": true,
373
+ "token": token,
374
+ "count": routes.count,
375
+ "mainPathIndex": mainPathIndex,
376
+ "routeIds": finalRouteIds,
377
+ "routes": routes
378
+ ]
379
+ }
380
+
381
+ private func buildTravelRouteStrategyLabel(scene: String, routeId: Int) -> String {
382
+ switch routeId {
383
+ case 12:
384
+ return "推荐"
385
+ case 13:
386
+ return scene == "ride" ? "时间短" : "步行便捷"
387
+ case 14:
388
+ return scene == "ride" ? "距离短" : "少换向"
389
+ default:
390
+ return scene == "ride" ? "骑行路线" : "步行路线"
391
+ }
392
+ }
393
+
243
394
  private func convertIndependentDriveResult(
244
395
  routeGroup: AMapNaviRouteGroup,
245
396
  token: Int
@@ -254,10 +405,12 @@ class IndependentRouteService: NSObject {
254
405
  let key = NSNumber(value: routeId)
255
406
  guard let route = naviRoutes[key] else { continue }
256
407
  routes.append([
408
+ "id": routeId,
257
409
  "routeId": routeId,
258
410
  "distance": route.routeLength,
259
411
  "duration": route.routeTime,
260
412
  "tollCost": route.routeTollCost,
413
+ "trafficLightCount": route.routeTrafficLightCount,
261
414
  "strategy": "推荐路线",
262
415
  "polyline": extractCoordinates(from: route)
263
416
  ])
@@ -265,10 +418,12 @@ class IndependentRouteService: NSObject {
265
418
  } else if let route = routeGroup.naviRoute {
266
419
  let routeId = routeGroup.naviRouteID
267
420
  routes.append([
421
+ "id": routeId,
268
422
  "routeId": routeId,
269
423
  "distance": route.routeLength,
270
424
  "duration": route.routeTime,
271
425
  "tollCost": route.routeTollCost,
426
+ "trafficLightCount": route.routeTrafficLightCount,
272
427
  "strategy": "推荐路线",
273
428
  "polyline": extractCoordinates(from: route)
274
429
  ])
@@ -326,10 +481,12 @@ extension IndependentRouteService: AMapNaviDriveManagerDelegate {
326
481
  for routeID in routeIDs {
327
482
  if let route = driveManager.naviRoutes?[routeID] {
328
483
  routes.append([
484
+ "id": routeID.intValue,
329
485
  "routeId": routeID.intValue,
330
486
  "distance": route.routeLength,
331
487
  "duration": route.routeTime,
332
488
  "tollCost": route.routeTollCost,
489
+ "trafficLightCount": route.routeTrafficLightCount,
333
490
  "strategy": "推荐路线",
334
491
  "polyline": extractCoordinates(from: route)
335
492
  ])
@@ -365,6 +522,7 @@ extension IndependentRouteService: AMapNaviWalkManagerDelegate {
365
522
  var routes: [[String: Any]] = []
366
523
  if let naviRoute = walkManager.naviRoute {
367
524
  routes.append([
525
+ "id": 1,
368
526
  "routeId": 1,
369
527
  "distance": naviRoute.routeLength,
370
528
  "duration": naviRoute.routeTime,
@@ -401,6 +559,7 @@ extension IndependentRouteService: AMapNaviRideManagerDelegate {
401
559
  var routes: [[String: Any]] = []
402
560
  if let naviRoute = rideManager.naviRoute {
403
561
  routes.append([
562
+ "id": 1,
404
563
  "routeId": 1,
405
564
  "distance": naviRoute.routeLength,
406
565
  "duration": naviRoute.routeTime,
@@ -0,0 +1,48 @@
1
+ import Foundation
2
+
3
+ #if canImport(ActivityKit)
4
+ import ActivityKit
5
+
6
+ @available(iOS 16.1, *)
7
+ public struct NavigationLiveActivityAttributes: ActivityAttributes {
8
+ public struct ContentState: Codable, Hashable {
9
+ public var currentRoadName: String
10
+ public var nextRoadName: String
11
+ public var pathRetainDistance: Int
12
+ public var routeTotalDistance: Int
13
+ public var pathRetainTime: Int
14
+ public var curStepRetainDistance: Int
15
+ public var iconType: Int
16
+ public var turnIconBase64: String?
17
+ public var updatedAt: Date
18
+
19
+ public init(
20
+ currentRoadName: String,
21
+ nextRoadName: String,
22
+ pathRetainDistance: Int,
23
+ routeTotalDistance: Int,
24
+ pathRetainTime: Int,
25
+ curStepRetainDistance: Int,
26
+ iconType: Int,
27
+ turnIconBase64: String? = nil,
28
+ updatedAt: Date
29
+ ) {
30
+ self.currentRoadName = currentRoadName
31
+ self.nextRoadName = nextRoadName
32
+ self.pathRetainDistance = pathRetainDistance
33
+ self.routeTotalDistance = routeTotalDistance
34
+ self.pathRetainTime = pathRetainTime
35
+ self.curStepRetainDistance = curStepRetainDistance
36
+ self.iconType = iconType
37
+ self.turnIconBase64 = turnIconBase64
38
+ self.updatedAt = updatedAt
39
+ }
40
+ }
41
+
42
+ public var appName: String
43
+
44
+ public init(appName: String) {
45
+ self.appName = appName
46
+ }
47
+ }
48
+ #endif