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.
- package/README.md +233 -3
- package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapModule.kt +4 -2
- package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviView.kt +931 -391
- package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviViewModule.kt +86 -1
- package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNavigationModule.kt +4 -5
- package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/IndependentRouteListener.kt +4 -3
- package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/RouteCalculateListener.kt +2 -2
- package/android/src/main/java/expo/modules/gaodemap/navigation/managers/IndependentRouteManager.kt +96 -14
- package/android/src/main/java/expo/modules/gaodemap/navigation/routes/drive/DriveTruckRouteCalculator.kt +2 -0
- package/android/src/main/java/expo/modules/gaodemap/navigation/utils/Converters.kt +19 -10
- package/android/src/main/res/drawable/landback_0.png +0 -0
- package/android/src/main/res/drawable/landback_1.png +0 -0
- package/android/src/main/res/drawable/landback_2.png +0 -0
- package/android/src/main/res/drawable/landback_3.png +0 -0
- package/android/src/main/res/drawable/landback_4.png +0 -0
- package/android/src/main/res/drawable/landback_5.png +0 -0
- package/android/src/main/res/drawable/landback_6.png +0 -0
- package/android/src/main/res/drawable/landback_7.png +0 -0
- package/android/src/main/res/drawable/landback_8.png +0 -0
- package/android/src/main/res/drawable/landback_9.png +0 -0
- package/android/src/main/res/drawable/landback_a.png +0 -0
- package/android/src/main/res/drawable/landback_b.png +0 -0
- package/android/src/main/res/drawable/landback_c.png +0 -0
- package/android/src/main/res/drawable/landback_d.png +0 -0
- package/android/src/main/res/drawable/landback_e.png +0 -0
- package/android/src/main/res/drawable/landback_f.png +0 -0
- package/android/src/main/res/drawable/landback_g.png +0 -0
- package/android/src/main/res/drawable/landback_h.png +0 -0
- package/android/src/main/res/drawable/landback_i.png +0 -0
- package/android/src/main/res/drawable/landback_j.png +0 -0
- package/android/src/main/res/drawable/landback_k.png +0 -0
- package/android/src/main/res/drawable/landback_l.png +0 -0
- package/android/src/main/res/drawable/landfront_0.png +0 -0
- package/android/src/main/res/drawable/landfront_00.png +0 -0
- package/android/src/main/res/drawable/landfront_1.png +0 -0
- package/android/src/main/res/drawable/landfront_11.png +0 -0
- package/android/src/main/res/drawable/landfront_20.png +0 -0
- package/android/src/main/res/drawable/landfront_21.png +0 -0
- package/android/src/main/res/drawable/landfront_22.png +0 -0
- package/android/src/main/res/drawable/landfront_3.png +0 -0
- package/android/src/main/res/drawable/landfront_33.png +0 -0
- package/android/src/main/res/drawable/landfront_40.png +0 -0
- package/android/src/main/res/drawable/landfront_43.png +0 -0
- package/android/src/main/res/drawable/landfront_44.png +0 -0
- package/android/src/main/res/drawable/landfront_5.png +0 -0
- package/android/src/main/res/drawable/landfront_55.png +0 -0
- package/android/src/main/res/drawable/landfront_61.png +0 -0
- package/android/src/main/res/drawable/landfront_63.png +0 -0
- package/android/src/main/res/drawable/landfront_66.png +0 -0
- package/android/src/main/res/drawable/landfront_70.png +0 -0
- package/android/src/main/res/drawable/landfront_71.png +0 -0
- package/android/src/main/res/drawable/landfront_73.png +0 -0
- package/android/src/main/res/drawable/landfront_77.png +0 -0
- package/android/src/main/res/drawable/landfront_8.png +0 -0
- package/android/src/main/res/drawable/landfront_88.png +0 -0
- package/android/src/main/res/drawable/landfront_90.png +0 -0
- package/android/src/main/res/drawable/landfront_95.png +0 -0
- package/android/src/main/res/drawable/landfront_99.png +0 -0
- package/android/src/main/res/drawable/landfront_a0.png +0 -0
- package/android/src/main/res/drawable/landfront_a8.png +0 -0
- package/android/src/main/res/drawable/landfront_aa.png +0 -0
- package/android/src/main/res/drawable/landfront_b1.png +0 -0
- package/android/src/main/res/drawable/landfront_b5.png +0 -0
- package/android/src/main/res/drawable/landfront_bb.png +0 -0
- package/android/src/main/res/drawable/landfront_c3.png +0 -0
- package/android/src/main/res/drawable/landfront_c8.png +0 -0
- package/android/src/main/res/drawable/landfront_cc.png +0 -0
- package/android/src/main/res/drawable/landfront_d.png +0 -0
- package/android/src/main/res/drawable/landfront_dd.png +0 -0
- package/android/src/main/res/drawable/landfront_e1.png +0 -0
- package/android/src/main/res/drawable/landfront_e5.png +0 -0
- package/android/src/main/res/drawable/landfront_ee.png +0 -0
- package/android/src/main/res/drawable/landfront_f0.png +0 -0
- package/android/src/main/res/drawable/landfront_f1.png +0 -0
- package/android/src/main/res/drawable/landfront_f5.png +0 -0
- package/android/src/main/res/drawable/landfront_ff.png +0 -0
- package/android/src/main/res/drawable/landfront_g3.png +0 -0
- package/android/src/main/res/drawable/landfront_g5.png +0 -0
- package/android/src/main/res/drawable/landfront_gg.png +0 -0
- package/android/src/main/res/drawable/landfront_h1.png +0 -0
- package/android/src/main/res/drawable/landfront_h3.png +0 -0
- package/android/src/main/res/drawable/landfront_h5.png +0 -0
- package/android/src/main/res/drawable/landfront_hh.png +0 -0
- package/android/src/main/res/drawable/landfront_i0.png +0 -0
- package/android/src/main/res/drawable/landfront_i3.png +0 -0
- package/android/src/main/res/drawable/landfront_i5.png +0 -0
- package/android/src/main/res/drawable/landfront_ii.png +0 -0
- package/android/src/main/res/drawable/landfront_j1.png +0 -0
- package/android/src/main/res/drawable/landfront_j8.png +0 -0
- package/android/src/main/res/drawable/landfront_jj.png +0 -0
- package/android/src/main/res/drawable/landfront_kk.png +0 -0
- package/android/src/main/res/drawable/landfront_ll.png +0 -0
- package/android/src/main/res/drawable/navi_arrow_leftline.png +0 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_center.xml +5 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_left.xml +8 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_over.xml +6 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_right.xml +8 -0
- package/build/ExpoGaodeMapNaviView.d.ts +8 -0
- package/build/ExpoGaodeMapNaviView.d.ts.map +1 -1
- package/build/ExpoGaodeMapNaviView.js +38 -1
- package/build/ExpoGaodeMapNaviView.js.map +1 -1
- package/build/index.d.ts +8 -4
- package/build/index.d.ts.map +1 -1
- package/build/index.js +408 -4
- package/build/index.js.map +1 -1
- package/build/types/independent.types.d.ts +91 -0
- package/build/types/independent.types.d.ts.map +1 -1
- package/build/types/independent.types.js.map +1 -1
- package/build/types/naviview.types.d.ts +256 -12
- package/build/types/naviview.types.d.ts.map +1 -1
- package/build/types/naviview.types.js.map +1 -1
- package/build/types/route.types.d.ts +2 -0
- package/build/types/route.types.d.ts.map +1 -1
- package/build/types/route.types.js.map +1 -1
- package/ios/ExpoGaodeMapNaviView.swift +888 -66
- package/ios/ExpoGaodeMapNaviViewModule.swift +87 -1
- package/ios/ExpoGaodeMapNavigationModule.swift +1 -1
- package/ios/managers/IndependentRouteManager.swift +1 -0
- package/ios/map/ExpoGaodeMapModule.swift +9 -4
- package/ios/map/ExpoGaodeMapView.swift +13 -2
- package/ios/map/modules/LocationManager.swift +17 -0
- package/ios/map/utils/PermissionManager.swift +11 -6
- package/ios/routes/drive/DriveTruckRouteCalculator.swift +9 -0
- package/ios/routes/walkride/WalkRideRouteCalculator.swift +30 -0
- package/ios/services/IndependentRouteService.swift +25 -0
- 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)
|
|
@@ -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.
|
|
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
|
|
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 {
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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": {
|