expo-gaode-map-navigation 1.0.1-next.0 → 1.0.1-next.1

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 CHANGED
@@ -1,49 +1,120 @@
1
1
  # expo-gaode-map-navigation
2
2
 
3
- 高德地图导航功能模块,为 `expo-gaode-map` 提供路径规划和导航引导功能。
3
+ 高德地图“导航一体化”模块。内置地图渲染能力与导航能力,提供从地图展示到路径规划与实时导航的完整解决方案。
4
4
 
5
- ## 功能特性
6
-
7
- - 🗺️ **路径规划**:支持驾车、步行、骑行、公交等多种出行方式
8
- - 🧭 **导航引导**:提供实时导航引导功能
9
- - 📍 **多种策略**:支持最快路线、最短路线、避免拥堵等策略
10
- - 🚗 **途经点支持**:支持设置途经点的路径规划
5
+ ## 模块定位与使用约束
11
6
 
12
- ## ⚠️ 重要提示
7
+ - 独立使用:本模块已封装地图相关能力(MapView/覆盖物等)与导航能力,不需要、也不应同时安装核心地图包。
8
+ - 禁止共存:请勿与 `expo-gaode-map` 同时安装或链接。两者均包含地图 SDK,Android 上会产生 `3dmap` vs `navi-3dmap` 的二进制冲突。
9
+ - 简化依赖:安装本模块即可获得地图 + 导航全量能力,无需额外地图依赖。
13
10
 
14
- **Android SDK 依赖冲突**:导航模块使用 `navi-3dmap` SDK,与核心包的 `3dmap` SDK 会产生冲突。
11
+ ## 功能特性
15
12
 
16
- 请务必阅读:[Android SDK 冲突解决方案](./ANDROID_SDK_CONFLICT.md)
13
+ - 🗺️ 地图渲染:内置地图视图与常用覆盖物(标注、折线、多边形、热力图、聚合等)
14
+ - 🧭 路径与导航:驾车、步行、骑行等多种出行策略与实时引导
15
+ - ⚙️ 策略丰富:最快、最短、避拥堵、少收费、少红绿灯等
16
+ - 🚗 复杂路线:支持多途经点、限行考虑、分段规划
17
+ - 🌐 Web API 协作:可与 `expo-gaode-map-web-api` 配合,统一通过基础初始化下发 Web Key 后使用
17
18
 
18
19
  ## 安装
19
20
 
20
- 首先确保已安装主包:
21
+ 仅安装本模块(不要安装 `expo-gaode-map`):
21
22
 
22
23
  ```bash
23
- npm install expo-gaode-map
24
+ # npm
25
+ npm install expo-gaode-map-navigation
26
+
27
+ # or yarn
28
+ yarn add expo-gaode-map-navigation
29
+
30
+ # or pnpm
31
+ pnpm add expo-gaode-map-navigation
24
32
  ```
25
33
 
26
- 然后安装导航模块:
34
+ 如果项目中已安装过核心地图包,请先移除避免冲突:
27
35
 
28
36
  ```bash
29
- npm install expo-gaode-map-navigation
37
+ npm uninstall expo-gaode-map
38
+ # or: yarn remove expo-gaode-map
39
+ # or: pnpm remove expo-gaode-map
30
40
  ```
31
41
 
32
- 或使用 yarn/pnpm:
42
+ ## 初始化
33
43
 
34
- ```bash
35
- yarn add expo-gaode-map-navigation
36
- pnpm add expo-gaode-map-navigation
44
+ 在应用启动阶段初始化 SDK Key(Android/iOS 原生 Key 与可选的 Web API Key):
45
+
46
+ ```ts
47
+ import { ExpoGaodeMapModule } from 'expo-gaode-map-navigation';
48
+
49
+ ExpoGaodeMapModule.initSDK({
50
+ androidKey: 'your-android-key',
51
+ iosKey: 'your-ios-key',
52
+ webKey: 'your-web-api-key', // 可选;若使用 Web API 包,建议一并下发
53
+ });
54
+ ```
55
+
56
+ 说明:
57
+ - 如后续使用 `expo-gaode-map-web-api`,建议同时传入 `webKey`,该包会从本模块运行时读取 `webKey`,实现“无参构造”的简化用法(new GaodeWebAPI())。
58
+
59
+ ## 地图与导航基础用法
60
+
61
+ 地图视图(内置地图能力):
62
+
63
+ ```tsx
64
+ import React from 'react';
65
+ import { View } from 'react-native';
66
+ import { MapView, Marker } from 'expo-gaode-map-navigation';
67
+
68
+ export default function BasicMapScreen() {
69
+ return (
70
+ <View style={{ flex: 1 }}>
71
+ <MapView
72
+ style={{ flex: 1 }}
73
+ initialCameraPosition={{
74
+ target: { latitude: 39.909186, longitude: 116.397411 },
75
+ zoom: 12,
76
+ }}
77
+ >
78
+ <Marker
79
+ position={{ latitude: 39.909186, longitude: 116.397411 }}
80
+ title="天安门"
81
+ snippet="北京·东城区"
82
+ />
83
+ </MapView>
84
+ </View>
85
+ );
86
+ }
87
+ ```
88
+
89
+ 路径规划与导航(示例):
90
+
91
+ ```ts
92
+ import { calculateRoute, DriveStrategy } from 'expo-gaode-map-navigation';
93
+
94
+ const result = await calculateRoute({
95
+ type: 'drive',
96
+ from: { latitude: 39.9, longitude: 116.4 },
97
+ to: { latitude: 39.91, longitude: 116.41 },
98
+ strategy: DriveStrategy.FASTEST,
99
+ });
100
+
101
+ // 结果包含距离/时长/分步指引等
37
102
  ```
38
103
 
39
- **Android 配置**:安装后需要修改核心包的 SDK 依赖,详见 [ANDROID_SDK_CONFLICT.md](./ANDROID_SDK_CONFLICT.md)
104
+ 说明:
105
+ - 地图组件与导航能力均来自 `expo-gaode-map-navigation`,无需、也不应从 `expo-gaode-map` 引入任何 API。
40
106
 
41
- ## 基础用法
107
+ ## 路径规划(原生与 Web API 双方案)
42
108
 
43
- ```typescript
109
+ 本模块同时支持“原生导航引擎路径规划”和“Web API 路径规划”,可按业务场景自由选择或组合使用:
110
+
111
+ - 原生方案(推荐用于移动端实时导航):端侧原生 SDK 能力,更适合实时引导、语音播报、复杂交通路况处理、弱网/离线等。
112
+ - Web API 方案(推荐用于快速查询/对比/多端一致):通过 `expo-gaode-map-web-api` 发起 HTTP 请求,便于统一计算逻辑、方案对比或与服务端配合。
113
+
114
+ 原生方案示例:
115
+ ```ts
44
116
  import { calculateRoute, DriveStrategy } from 'expo-gaode-map-navigation';
45
117
 
46
- // 驾车路径规划
47
118
  const result = await calculateRoute({
48
119
  type: 'drive',
49
120
  from: { latitude: 39.9, longitude: 116.4 },
@@ -51,15 +122,33 @@ const result = await calculateRoute({
51
122
  strategy: DriveStrategy.FASTEST,
52
123
  });
53
124
 
54
- console.log('距离:', result.distance, '米');
55
- console.log('时间:', result.duration, '秒');
56
- console.log('路径点:', result.steps.length, '步');
125
+ // result 包含距离/时长/分步指引等原生返回
57
126
  ```
58
127
 
59
- ## API 文档
128
+ Web API 方案示例(需在初始化时提供 webKey):
129
+ ```ts
130
+ import { GaodeWebAPI } from 'expo-gaode-map-web-api';
131
+
132
+ // 无参构造:从 expo-gaode-map-navigation 初始化中动态解析 webKey
133
+ const api = new GaodeWebAPI();
134
+
135
+ // 驾车路径规划(Web API)
136
+ const res = await api.route.driving('116.400000,39.900000', '116.410000,39.910000', {
137
+ show_fields: 'cost,navi',
138
+ });
139
+
140
+ // res.route.paths[0] 中包含距离/时长/导航步骤等
141
+ ```
142
+
143
+ 选择建议:
144
+ - 实时导航/引导优先原生方案;
145
+ - 方案对比、批量测算、多端统一优先 Web API;也可结合两者,在端上落地选择逻辑。
146
+
147
+ ## Android 注意事项
60
148
 
61
- 详细的 API 文档请参考主项目文档。
149
+ - 本模块内部使用 `navi-3dmap` 体系,已包含地图能力;请勿同时引入核心 `3dmap` 体系以免二进制冲突。
150
+ - 若历史项目从核心包迁移至本模块,务必移除 `expo-gaode-map` 依赖与其 native 配置(Gradle/CocoaPods 链接等)。
62
151
 
63
- ## 许可证
152
+ ## 许可
64
153
 
65
154
  MIT
@@ -32,6 +32,13 @@ class ExpoGaodeMapModule : Module() {
32
32
  override fun definition() = ModuleDefinition {
33
33
  Name("NaviMap")
34
34
 
35
+ // 在模块加载时尝试从本地缓存恢复隐私同意状态,避免每次启动都必须 JS 调用
36
+ try {
37
+ SDKInitializer.restorePrivacyState(appContext.reactContext!!)
38
+ } catch (e: Exception) {
39
+ android.util.Log.w("ExpoGaodeMap", "恢复隐私状态时出现问题: ${e.message}")
40
+ }
41
+
35
42
  // ==================== 隐私合规管理 ====================
36
43
 
37
44
  /**
@@ -1,12 +1,13 @@
1
1
  package expo.modules.gaodemap.map.modules
2
2
 
3
3
  import android.content.Context
4
+ import android.content.SharedPreferences
4
5
  import com.amap.api.location.AMapLocationClient
5
6
  import com.amap.api.maps.MapsInitializer
6
7
 
7
8
  /**
8
9
  * SDK 初始化管理器
9
- *
10
+ *
10
11
  * 负责:
11
12
  * - 初始化高德地图 SDK
12
13
  * - 初始化高德定位 SDK
@@ -15,8 +16,14 @@ import com.amap.api.maps.MapsInitializer
15
16
  */
16
17
  object SDKInitializer {
17
18
 
18
- /** 隐私协议是否已同意 */
19
+ /** 隐私协议是否已同意(进程内缓存) */
19
20
  private var privacyAgreed = false
21
+
22
+ private const val PREFS_NAME = "expo_gaode_map_prefs"
23
+ private const val KEY_PRIVACY_AGREED = "privacy_agreed"
24
+
25
+ private fun prefs(context: Context): SharedPreferences =
26
+ context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
20
27
 
21
28
  /**
22
29
  * 更新隐私合规状态
@@ -42,8 +49,36 @@ object SDKInitializer {
42
49
  AMapLocationClient.updatePrivacyAgree(context, false)
43
50
  android.util.Log.w("ExpoGaodeMap", "⚠️ 用户未同意隐私协议,SDK 功能将受限")
44
51
  }
52
+
53
+ // 持久化状态,供下次启动自动恢复
54
+ try {
55
+ prefs(context).edit().putBoolean(KEY_PRIVACY_AGREED, hasAgreed).apply()
56
+ } catch (e: Exception) {
57
+ android.util.Log.w("ExpoGaodeMap", "持久化隐私状态失败: ${e.message}")
58
+ }
45
59
  }
46
60
 
61
+ /**
62
+ * 从本地存储恢复隐私合规状态(在应用启动或模块加载时调用)
63
+ * 若无记录则保持默认 false,不抛出异常。
64
+ */
65
+ fun restorePrivacyState(context: Context) {
66
+ try {
67
+ val saved = prefs(context).getBoolean(KEY_PRIVACY_AGREED, false)
68
+ privacyAgreed = saved
69
+
70
+ // 同步到 SDK
71
+ MapsInitializer.updatePrivacyShow(context, true, true)
72
+ AMapLocationClient.updatePrivacyShow(context, true, true)
73
+ MapsInitializer.updatePrivacyAgree(context, saved)
74
+ AMapLocationClient.updatePrivacyAgree(context, saved)
75
+
76
+ android.util.Log.d("ExpoGaodeMap", "🔁 已从缓存恢复隐私状态: $saved")
77
+ } catch (e: Exception) {
78
+ android.util.Log.w("ExpoGaodeMap", "恢复隐私状态失败: ${e.message}")
79
+ }
80
+ }
81
+
47
82
  /**
48
83
  * 检查隐私协议是否已同意
49
84
  *
@@ -79,7 +114,7 @@ object SDKInitializer {
79
114
 
80
115
  /**
81
116
  * 获取 SDK 版本号
82
- *
117
+ *
83
118
  * @return SDK 版本字符串
84
119
  */
85
120
  fun getVersion(): String {
@@ -18,16 +18,27 @@ public class NaviMapModule: Module {
18
18
  private var permissionManager: PermissionManager?
19
19
  /// 隐私协议是否已同意(模块级别跟踪)
20
20
  private static var privacyAgreed: Bool = false
21
+ /// 隐私同意持久化 Key
22
+ private static let privacyDefaultsKey = "expo_gaode_map_privacy_agreed"
21
23
 
22
24
  public func definition() -> ModuleDefinition {
23
25
  Name("NaviMap")
24
26
 
25
- // 模块初始化时不设置隐私合规
26
- // 需要在用户同意隐私协议后手动调用 updatePrivacyCompliance 方法
27
+ // 模块初始化:尝试从本地缓存恢复隐私同意状态
27
28
  OnCreate {
28
- // 仅更新隐私信息显示状态,不表示用户已同意
29
+ // 先确保隐私信息展示状态
29
30
  MAMapView.updatePrivacyShow(AMapPrivacyShowStatus.didShow, privacyInfo: AMapPrivacyInfoStatus.didContain)
30
- print("ℹ️ ExpoGaodeMap: 隐私信息已更新,但需要用户同意隐私协议才能使用 SDK")
31
+
32
+ // 从 UserDefaults 恢复上次的同意状态(默认 false)
33
+ let saved = UserDefaults.standard.bool(forKey: NaviMapModule.privacyDefaultsKey)
34
+ NaviMapModule.privacyAgreed = saved
35
+ if saved {
36
+ // 同步到 SDK
37
+ MAMapView.updatePrivacyAgree(AMapPrivacyAgreeStatus.didAgree)
38
+ print("🔁 ExpoGaodeMap: 已从缓存恢复隐私同意状态: true")
39
+ } else {
40
+ print("ℹ️ ExpoGaodeMap: 未发现已同意记录,等待用户同意后再使用 SDK")
41
+ }
31
42
  }
32
43
 
33
44
  // ==================== 隐私合规管理 ====================
@@ -37,10 +48,15 @@ public class NaviMapModule: Module {
37
48
  * 必须在用户同意隐私协议后调用
38
49
  */
39
50
  Function("updatePrivacyCompliance") { (hasAgreed: Bool) in
51
+ // 更新内存状态
40
52
  NaviMapModule.privacyAgreed = hasAgreed
53
+ // 持久化到本地,供下次启动自动恢复
54
+ UserDefaults.standard.set(hasAgreed, forKey: NaviMapModule.privacyDefaultsKey)
55
+
41
56
  if hasAgreed {
57
+ // 同步到 SDK
42
58
  MAMapView.updatePrivacyAgree(AMapPrivacyAgreeStatus.didAgree)
43
- print("✅ ExpoGaodeMap: 用户已同意隐私协议,可以使用 SDK")
59
+ print("✅ ExpoGaodeMap: 用户已同意隐私协议,可以使用 SDK(状态已持久化)")
44
60
 
45
61
  // 在用户同意后,如果尚未设置 API Key,则尝试从 Info.plist 读取并设置
46
62
  if AMapServices.shared().apiKey == nil || AMapServices.shared().apiKey?.isEmpty == true {
@@ -54,7 +70,7 @@ public class NaviMapModule: Module {
54
70
  }
55
71
  } else {
56
72
  MAMapView.updatePrivacyAgree(AMapPrivacyAgreeStatus.notAgree)
57
- print("⚠️ ExpoGaodeMap: 用户未同意隐私协议,SDK 功能将受限")
73
+ print("⚠️ ExpoGaodeMap: 用户未同意隐私协议,SDK 功能将受限(状态已持久化)")
58
74
  }
59
75
  }
60
76
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-gaode-map-navigation",
3
- "version": "1.0.1-next.0",
3
+ "version": "1.0.1-next.1",
4
4
  "description": "高德地图导航功能模块 - 路径规划、导航引导,基于expo-gaode-map",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.d.ts",
@@ -22,7 +22,7 @@
22
22
  "license": "MIT",
23
23
  "homepage": "https://github.com/TomWq/expo-gaode-map#readme",
24
24
  "dependencies": {
25
- "expo-gaode-map": "^2.2.4-next.0"
25
+ "expo-gaode-map": "^2.1.1-next.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/react": "~19.1.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-gaode-map-navigation",
3
- "version": "1.0.0-beta.0",
3
+ "version": "1.0.0",
4
4
  "description": "高德地图导航功能模块 - 路径规划、导航引导,基于expo-gaode-map",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.d.ts",