expo-gaode-map-navigation 2.0.12 → 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 (51) hide show
  1. package/README.md +7 -2
  2. package/android/build.gradle +8 -4
  3. package/android/src/main/AndroidManifest.xml +8 -0
  4. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapOfflineModule.kt +83 -15
  5. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapView.kt +13 -3
  6. package/android/src/main/java/expo/modules/gaodemap/map/managers/UIManager.kt +36 -39
  7. package/android/src/main/java/expo/modules/gaodemap/map/overlays/ClusterView.kt +5 -2
  8. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapView.kt +122 -10
  9. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapViewModule.kt +2 -2
  10. package/android/src/main/java/expo/modules/gaodemap/map/search/ExpoGaodeMapSearchModule.kt +751 -0
  11. package/build/map/ExpoGaodeMapOfflineModule.d.ts +5 -0
  12. package/build/map/ExpoGaodeMapOfflineModule.d.ts.map +1 -1
  13. package/build/map/ExpoGaodeMapOfflineModule.js.map +1 -1
  14. package/build/map/components/overlays/HeatMap.d.ts.map +1 -1
  15. package/build/map/components/overlays/HeatMap.js +21 -2
  16. package/build/map/components/overlays/HeatMap.js.map +1 -1
  17. package/build/map/index.d.ts +3 -0
  18. package/build/map/index.d.ts.map +1 -1
  19. package/build/map/index.js +3 -0
  20. package/build/map/index.js.map +1 -1
  21. package/build/map/search/ExpoGaodeMapSearch.types.d.ts +340 -0
  22. package/build/map/search/ExpoGaodeMapSearch.types.d.ts.map +1 -0
  23. package/build/map/search/ExpoGaodeMapSearch.types.js +19 -0
  24. package/build/map/search/ExpoGaodeMapSearch.types.js.map +1 -0
  25. package/build/map/search/ExpoGaodeMapSearchModule.d.ts +74 -0
  26. package/build/map/search/ExpoGaodeMapSearchModule.d.ts.map +1 -0
  27. package/build/map/search/ExpoGaodeMapSearchModule.js +47 -0
  28. package/build/map/search/ExpoGaodeMapSearchModule.js.map +1 -0
  29. package/build/map/search/index.d.ts +156 -0
  30. package/build/map/search/index.d.ts.map +1 -0
  31. package/build/map/search/index.js +171 -0
  32. package/build/map/search/index.js.map +1 -0
  33. package/build/map/types/map-view.types.d.ts +4 -2
  34. package/build/map/types/map-view.types.d.ts.map +1 -1
  35. package/build/map/types/map-view.types.js.map +1 -1
  36. package/build/map/utils/ErrorHandler.js +11 -11
  37. package/build/map/utils/ErrorHandler.js.map +1 -1
  38. package/build/map/utils/OfflineMapManager.d.ts +4 -0
  39. package/build/map/utils/OfflineMapManager.d.ts.map +1 -1
  40. package/build/map/utils/OfflineMapManager.js +6 -0
  41. package/build/map/utils/OfflineMapManager.js.map +1 -1
  42. package/expo-module.config.json +4 -2
  43. package/ios/ExpoGaodeMapNaviView.swift +16 -17
  44. package/ios/ExpoGaodeMapNavigation.podspec +2 -1
  45. package/ios/map/ExpoGaodeMapOfflineModule.swift +61 -0
  46. package/ios/map/ExpoGaodeMapSearchModule.swift +773 -0
  47. package/ios/map/modules/LocationManager.swift +9 -3
  48. package/ios/map/overlays/PolylineView.swift +6 -12
  49. package/package.json +1 -1
  50. package/plugin/build/withGaodeMap.js +12 -0
  51. package/android/src/main/java/expo/modules/gaodemap/navigation/managers/RouteCalculator.kt +0 -173
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../../../src/map/utils/ErrorHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 高德地图错误处理工具\n * 提供友好的错误提示和解决方案指引\n */\n\n/**\n * 错误类型枚举\n */\nexport enum ErrorType {\n /** SDK 未初始化 */\n SDK_NOT_INITIALIZED = 'SDK_NOT_INITIALIZED',\n /** 隐私协议未确认 */\n PRIVACY_NOT_AGREED = 'PRIVACY_NOT_AGREED',\n /** API Key 配置错误 */\n INVALID_API_KEY = 'INVALID_API_KEY',\n /** 权限未授予 */\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n /** 定位失败 */\n LOCATION_FAILED = 'LOCATION_FAILED',\n /** 原生模块不可用 */\n NATIVE_MODULE_UNAVAILABLE = 'NATIVE_MODULE_UNAVAILABLE',\n /** 地图视图未初始化 */\n MAP_VIEW_NOT_INITIALIZED = 'MAP_VIEW_NOT_INITIALIZED',\n /** 参数错误 */\n INVALID_PARAMETER = 'INVALID_PARAMETER',\n /** 网络错误 */\n NETWORK_ERROR = 'NETWORK_ERROR',\n}\n\n/**\n * 错误详情接口\n */\nexport interface ErrorDetails {\n /** 错误类型 */\n type: ErrorType;\n /** 错误消息 */\n message: string;\n /** 解决方案 */\n solution: string;\n /** 文档链接 */\n docUrl?: string;\n /** 原始错误 */\n originalError?: Error;\n}\n\n/**\n * 自定义错误类\n */\nexport class GaodeMapError extends Error {\n type: ErrorType;\n solution: string;\n docUrl?: string;\n originalError?: Error;\n\n constructor(details: ErrorDetails) {\n const fullMessage = `\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n🗺️ 高德地图错误 [${details.type}]\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n❌ 错误信息:\n ${details.message}\n\n💡 解决方案:\n ${details.solution}\n\n${details.docUrl ? `📖 详细文档:\\n ${details.docUrl}\\n` : ''}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;\n super(fullMessage);\n this.name = 'GaodeMapError';\n this.type = details.type;\n this.solution = details.solution;\n this.docUrl = details.docUrl;\n this.originalError = details.originalError;\n }\n}\n\n/**\n * 错误处理器类\n */\nexport class ErrorHandler {\n private static docBaseUrl = 'https://TomWq.github.io/expo-gaode-map';\n\n /**\n * SDK 未初始化错误\n */\n static sdkNotInitialized(): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.SDK_NOT_INITIALIZED,\n message: '高德地图 SDK 尚未初始化',\n solution: `请在使用地图功能前先调用 initSDK():\n\nimport ExpoGaodeMapModule from 'expo-gaode-map';\n\nuseEffect(() => {\n // 在组件挂载时初始化\n ExpoGaodeMapModule.initSDK({\n androidKey: 'your-android-key',\n iosKey: 'your-ios-key',\n });\n}, []);\n\n⚠️ 常见原因:\n1. 忘记调用 initSDK() 就使用了定位或地图功能\n2. initSDK() 调用时机过晚(应在 useEffect 中尽早调用)\n3. 使用 Config Plugin 但未重新构建原生代码`,\n docUrl: `${this.docBaseUrl}/guide/initialization.html`,\n });\n }\n\n /**\n * 隐私协议未确认错误\n */\n static privacyNotAgreed(scene: 'map' | 'sdk'): GaodeMapError {\n const sceneText = scene === 'map' ? '渲染 MapView' : '初始化 SDK';\n return new GaodeMapError({\n type: ErrorType.PRIVACY_NOT_AGREED,\n message: `调用高德地图前未完成隐私合规确认:${sceneText}`,\n solution: `请在调用任何高德地图 SDK 接口前,先明确完成隐私告知与同意:\n\nimport ExpoGaodeMapModule from 'expo-gaode-map';\n\n// 应用启动后,先展示你自己的隐私弹窗\nExpoGaodeMapModule.setPrivacyConfig({\n hasShow: true,\n hasContainsPrivacy: true,\n hasAgree: true,\n});\n\n// 然后再初始化 SDK / 渲染地图\nExpoGaodeMapModule.initSDK({\n androidKey: 'your-android-key',\n iosKey: 'your-ios-key',\n});\n\n⚠️ 升级注意:\n1. 不能只 import 包后直接渲染 MapView\n2. Android 若未先设置隐私,原生 SDK 可能直接报 555570\n3. 推荐在应用首次启动时先弹出隐私协议,同意后再进入地图页面`,\n docUrl: `${this.docBaseUrl}/guide/initialization.html`,\n });\n }\n\n /**\n * API Key 配置错误\n */\n static invalidApiKey(platform: 'android' | 'ios' | 'both'): GaodeMapError {\n const platformText = {\n android: 'Android',\n ios: 'iOS',\n both: 'Android 和 iOS',\n }[platform];\n\n return new GaodeMapError({\n type: ErrorType.INVALID_API_KEY,\n message: `${platformText} API Key 配置错误或未配置`,\n solution: `⚠️ API Key 与 Bundle ID 不匹配是最常见的原因!\n\n请检查以下步骤:\n\n1️⃣ 确认 API Key 的配置:\n • 访问高德开放平台:https://lbs.amap.com/\n • 检查您的应用配置中的 Bundle ID 是否与当前项目一致\n • iOS Bundle ID:在 Xcode → Target → General → Bundle Identifier 查看\n • Android 包名:在 android/app/build.gradle → applicationId 查看\n\n2️⃣ 重新创建正确的 API Key(如果 Bundle ID 不同):\n • 在高德开放平台创建新应用\n • 填写正确的 Bundle ID(iOS)或包名(Android)\n • 获取新的 API Key\n\n3️⃣ 配置 API Key(推荐使用 Config Plugin):\n\n在 app.json 中配置:\n{\n \"expo\": {\n \"plugins\": [\n [\n \"expo-gaode-map\",\n {\n \"androidKey\": \"your-android-key\",\n \"iosKey\": \"your-ios-key\"\n }\n ]\n ]\n }\n}\n\n然后重新构建:\nnpx expo prebuild --clean\nnpx expo run:${platform === 'ios' ? 'ios' : 'android'}\n\n4️⃣ 或在代码中配置:\nExpoGaodeMapModule.initSDK({\n androidKey: 'your-android-key',\n iosKey: 'your-ios-key',\n});`,\n docUrl: `${this.docBaseUrl}/guide/initialization.html`,\n });\n }\n\n /**\n * 权限未授予错误\n */\n static permissionDenied(permissionType: 'location'): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.PERMISSION_DENIED,\n message: '定位权限未授予,无法使用定位功能',\n solution: `请按以下步骤授予权限:\n\n1️⃣ 请求权限:\nimport ExpoGaodeMapModule from 'expo-gaode-map';\n\nconst checkPermission = async () => {\n // 检查权限状态\n const status = await ExpoGaodeMapModule.checkLocationPermission();\n \n if (!status.granted) {\n // 请求权限\n const result = await ExpoGaodeMapModule.requestLocationPermission();\n \n if (!result.granted) {\n // 用户拒绝授权,引导用户去设置\n Alert.alert(\n '需要定位权限',\n '请在设置中开启定位权限以使用地图功能',\n [\n { text: '取消', style: 'cancel' },\n { text: '去设置', onPress: () => Linking.openSettings() }\n ]\n );\n }\n }\n};\n\n2️⃣ iOS 配置(在 app.json 中):\n{\n \"expo\": {\n \"ios\": {\n \"infoPlist\": {\n \"NSLocationWhenInUseUsageDescription\": \"需要获取您的位置信息以显示地图\",\n \"NSLocationAlwaysAndWhenInUseUsageDescription\": \"需要获取您的位置信息\"\n }\n }\n }\n}\n\n3️⃣ Android 配置(Config Plugin 会自动添加):\n使用 expo-gaode-map 的 Config Plugin 会自动添加必要的权限声明`,\n docUrl: `${this.docBaseUrl}/guide/getting-started.html#权限配置`,\n });\n }\n\n /**\n * 定位失败错误\n */\n static locationFailed(reason?: string): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.LOCATION_FAILED,\n message: `定位失败${reason ? `:${reason}` : ''}`,\n solution: `⚠️ 最常见原因:API Key 与 Bundle ID 不匹配!\n\n请按以下顺序排查:\n\n1️⃣ 检查 API Key 配置(最常见问题):\n • 访问高德开放平台:https://lbs.amap.com/\n • 确认您的应用的 Bundle ID 与当前项目一致\n • iOS Bundle ID:在 Xcode → Target → General → Bundle Identifier\n • Android 包名:在 android/app/build.gradle → applicationId\n \n 如果 Bundle ID 不同,必须在高德平台重新创建应用并获取新 Key\n\n2️⃣ 检查设备 GPS 和网络:\n • 确认设备 GPS 已开启\n • 检查网络连接是否正常\n • 尝试在室外空旷处测试\n\n3️⃣ 检查定位权限:\n • iOS:设置 → 隐私 → 定位服务 → 允许应用访问\n • Android:设置 → 应用 → 权限管理 → 位置信息\n\n4️⃣ 配置定位参数(如果 API Key 正确但定位仍失败):\nExpoGaodeMapModule.setLocationTimeout(30); // 增加超时时间\nExpoGaodeMapModule.setInterval(2000); // 设置定位间隔\n\n// Android 特有配置\nExpoGaodeMapModule.setLocationMode(2); // 高精度模式\nExpoGaodeMapModule.setGpsFirst(true); // GPS 优先\n\n// iOS 特有配置\nExpoGaodeMapModule.setDesiredAccuracy(0); // 最佳精度`,\n docUrl: `${this.docBaseUrl}/api/location.html`,\n });\n }\n\n /**\n * 原生模块不可用错误\n */\n static nativeModuleUnavailable(): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.NATIVE_MODULE_UNAVAILABLE,\n message: 'expo-gaode-map 原生模块不可用',\n solution: `请检查以下步骤:\n\n1️⃣ 确认已正确安装:\nnpm install expo-gaode-map\n# 或\nbun install expo-gaode-map\n\n2️⃣ 重新构建原生代码:\nnpx expo prebuild --clean\nnpx expo run:android\nnpx expo run:ios\n\n3️⃣ 检查 Expo 版本兼容性:\n• expo-gaode-map 需要 Expo SDK 49+\n• 不支持 Expo Go,必须使用 Development Build\n\n4️⃣ 检查是否与其他包冲突:\n• 不能同时安装 expo-gaode-map 和 expo-gaode-map-navigation\n• 两个包选择其一使用\n\n5️⃣ 清理缓存后重试:\ncd android && ./gradlew clean && cd ..\ncd ios && pod deintegrate && pod install && cd ..`,\n docUrl: `${this.docBaseUrl}/guide/getting-started.html`,\n });\n }\n\n /**\n * 地图视图未初始化错误\n */\n static mapViewNotInitialized(methodName: string): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.MAP_VIEW_NOT_INITIALIZED,\n message: `无法调用 ${methodName}:地图视图尚未初始化`,\n solution: `请确保:\n\n1️⃣ MapView 已经渲染完成\n2️⃣ 使用 ref 获取地图实例后再调用方法\n\n正确用法:\nimport { MapView, MapViewRef } from 'expo-gaode-map';\n\nconst App = () => {\n const mapRef = useRef<MapViewRef>(null);\n \n // ❌ 错误:在渲染前调用\n // mapRef.current?.moveCamera(...);\n \n // ✅ 正确:等待地图加载完成\n const handleMapReady = () => {\n mapRef.current?.moveCamera({\n target: { latitude: 39.9, longitude: 116.4 },\n zoom: 15,\n });\n };\n \n return (\n <MapView\n ref={mapRef}\n onMapReady={handleMapReady}\n />\n );\n};`,\n docUrl: `${this.docBaseUrl}/api/mapview.html`,\n });\n }\n\n /**\n * 参数错误\n */\n static invalidParameter(paramName: string, expected: string, received: unknown): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.INVALID_PARAMETER,\n message: `参数 \"${paramName}\" 类型错误`,\n solution: `期望类型:${expected}\n实际接收:${typeof received} (${JSON.stringify(received)})\n\n请检查传入的参数是否符合要求。\n\n💡 提示:\n• 使用 TypeScript 可以在编译时发现类型错误\n• 参考 API 文档了解正确的参数类型`,\n docUrl: `${this.docBaseUrl}/api/`,\n });\n }\n\n /**\n * 网络错误\n */\n static networkError(originalError?: Error): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.NETWORK_ERROR,\n message: '网络请求失败',\n solution: `请检查:\n\n1️⃣ 网络连接是否正常\n2️⃣ API Key 是否有效\n3️⃣ 是否超出配额限制\n\n💡 如果问题持续,请:\n• 检查高德开放平台控制台\n• 查看 API 调用量和配额\n• 确认 Key 的服务是否已开通`,\n docUrl: `${this.docBaseUrl}/guide/troubleshooting.html`,\n originalError,\n });\n }\n\n /**\n * 包装原生错误,提供更友好的提示\n */\n static wrapNativeError(error: unknown, context: string): GaodeMapError {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const scene = context.includes('MapView') || context.includes('渲染') ? 'map' : 'sdk';\n\n if (\n errorMessage.includes('PRIVACY_NOT_AGREED') ||\n errorMessage.includes('隐私协议未完成确认') ||\n errorMessage.includes('隐私合规校验失败') ||\n errorMessage.includes('555570') ||\n errorMessage.includes('确保调用SDK任何接口前先调用更新隐私合规')\n ) {\n return this.privacyNotAgreed(scene);\n }\n \n // SDK 未初始化相关错误\n if (\n errorMessage.includes('not initialized') ||\n errorMessage.includes('未初始化') ||\n errorMessage.includes('SDK未设置')\n ) {\n return this.sdkNotInitialized();\n }\n \n // API Key 相关错误\n if (\n errorMessage.includes('key') ||\n errorMessage.includes('invalid') ||\n errorMessage.includes('鉴权失败')\n ) {\n return this.invalidApiKey('both');\n }\n \n // 权限相关错误\n if (\n errorMessage.includes('permission') ||\n errorMessage.includes('权限')\n ) {\n return this.permissionDenied('location');\n }\n \n // 定位相关错误\n if (\n errorMessage.includes('location') ||\n errorMessage.includes('定位')\n ) {\n return this.locationFailed(errorMessage);\n }\n \n // 通用错误\n return new GaodeMapError({\n type: ErrorType.INVALID_PARAMETER,\n message: `${context} 失败`,\n solution: `原始错误信息:${errorMessage}\n\n如果问题持续,请:\n1. 查看完整的错误堆栈\n2. 检查 API 调用参数\n3. 提交 Issue:https://github.com/TomWq/expo-gaode-map/issues`,\n originalError: error instanceof Error ? error : undefined,\n });\n }\n}\n\n/**\n * 错误日志工具\n */\nexport class ErrorLogger {\n // 兼容不同环境:Bun/Jest/Node\n private static isEnabled = typeof __DEV__ !== 'undefined' ? __DEV__ : true;\n\n /**\n * 启用/禁用错误日志\n */\n static setEnabled(enabled: boolean) {\n this.isEnabled = enabled;\n }\n\n /**\n * 记录错误\n */\n static log(error: GaodeMapError) {\n if (!this.isEnabled) return;\n\n console.error(error.message);\n \n if (error.originalError) {\n console.error('原始错误:', error.originalError);\n }\n }\n\n /**\n * 记录警告\n */\n static warn(message: string, details?: unknown) {\n if (!this.isEnabled) return;\n \n console.warn(`⚠️ expo-gaode-map: ${message}`, details || '');\n }\n}\n"]}
1
+ {"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../../../src/map/utils/ErrorHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 高德地图错误处理工具\n * 提供友好的错误提示和解决方案指引\n */\n\n/**\n * 错误类型枚举\n */\nexport enum ErrorType {\n /** SDK 未初始化 */\n SDK_NOT_INITIALIZED = 'SDK_NOT_INITIALIZED',\n /** 隐私协议未确认 */\n PRIVACY_NOT_AGREED = 'PRIVACY_NOT_AGREED',\n /** API Key 配置错误 */\n INVALID_API_KEY = 'INVALID_API_KEY',\n /** 权限未授予 */\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n /** 定位失败 */\n LOCATION_FAILED = 'LOCATION_FAILED',\n /** 原生模块不可用 */\n NATIVE_MODULE_UNAVAILABLE = 'NATIVE_MODULE_UNAVAILABLE',\n /** 地图视图未初始化 */\n MAP_VIEW_NOT_INITIALIZED = 'MAP_VIEW_NOT_INITIALIZED',\n /** 参数错误 */\n INVALID_PARAMETER = 'INVALID_PARAMETER',\n /** 网络错误 */\n NETWORK_ERROR = 'NETWORK_ERROR',\n}\n\n/**\n * 错误详情接口\n */\nexport interface ErrorDetails {\n /** 错误类型 */\n type: ErrorType;\n /** 错误消息 */\n message: string;\n /** 解决方案 */\n solution: string;\n /** 文档链接 */\n docUrl?: string;\n /** 原始错误 */\n originalError?: Error;\n}\n\n/**\n * 自定义错误类\n */\nexport class GaodeMapError extends Error {\n type: ErrorType;\n solution: string;\n docUrl?: string;\n originalError?: Error;\n\n constructor(details: ErrorDetails) {\n const fullMessage = `\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n🗺️ 高德地图错误 [${details.type}]\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n❌ 错误信息:\n ${details.message}\n\n💡 解决方案:\n ${details.solution}\n\n${details.docUrl ? `📖 详细文档:\\n ${details.docUrl}\\n` : ''}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;\n super(fullMessage);\n this.name = 'GaodeMapError';\n this.type = details.type;\n this.solution = details.solution;\n this.docUrl = details.docUrl;\n this.originalError = details.originalError;\n }\n}\n\n/**\n * 错误处理器类\n */\nexport class ErrorHandler {\n private static docBaseUrl = 'https://TomWq.github.io/expo-gaode-map';\n\n /**\n * SDK 未初始化错误\n */\n static sdkNotInitialized(): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.SDK_NOT_INITIALIZED,\n message: '高德地图 SDK 尚未初始化',\n solution: `请在使用地图功能前先调用 initSDK():\n\nimport {ExpoGaodeMapModule} from 'expo-gaode-map-navigation';\n\nuseEffect(() => {\n // 在组件挂载时初始化\n ExpoGaodeMapModule.initSDK({\n androidKey: 'your-android-key',\n iosKey: 'your-ios-key',\n });\n}, []);\n\n⚠️ 常见原因:\n1. 忘记调用 initSDK() 就使用了定位或地图功能\n2. initSDK() 调用时机过晚(应在 useEffect 中尽早调用)\n3. 使用 Config Plugin 但未重新构建原生代码`,\n docUrl: `${this.docBaseUrl}/guide/initialization.html`,\n });\n }\n\n /**\n * 隐私协议未确认错误\n */\n static privacyNotAgreed(scene: 'map' | 'sdk'): GaodeMapError {\n const sceneText = scene === 'map' ? '渲染 MapView' : '初始化 SDK';\n return new GaodeMapError({\n type: ErrorType.PRIVACY_NOT_AGREED,\n message: `调用高德地图前未完成隐私合规确认:${sceneText}`,\n solution: `请在调用任何高德地图 SDK 接口前,先明确完成隐私告知与同意:\n\nimport {ExpoGaodeMapModule} from 'expo-gaode-map-navigation';\n\n// 应用启动后,先展示你自己的隐私弹窗\nExpoGaodeMapModule.setPrivacyConfig({\n hasShow: true,\n hasContainsPrivacy: true,\n hasAgree: true,\n});\n\n// 然后再初始化 SDK / 渲染地图\nExpoGaodeMapModule.initSDK({\n androidKey: 'your-android-key',\n iosKey: 'your-ios-key',\n});\n\n⚠️ 升级注意:\n1. 不能只 import 包后直接渲染 MapView\n2. Android 若未先设置隐私,原生 SDK 可能直接报 555570\n3. 推荐在应用首次启动时先弹出隐私协议,同意后再进入地图页面`,\n docUrl: `${this.docBaseUrl}/guide/initialization.html`,\n });\n }\n\n /**\n * API Key 配置错误\n */\n static invalidApiKey(platform: 'android' | 'ios' | 'both'): GaodeMapError {\n const platformText = {\n android: 'Android',\n ios: 'iOS',\n both: 'Android 和 iOS',\n }[platform];\n\n return new GaodeMapError({\n type: ErrorType.INVALID_API_KEY,\n message: `${platformText} API Key 配置错误或未配置`,\n solution: `⚠️ API Key 与 Bundle ID 不匹配是最常见的原因!\n\n请检查以下步骤:\n\n1️⃣ 确认 API Key 的配置:\n • 访问高德开放平台:https://lbs.amap.com/\n • 检查您的应用配置中的 Bundle ID 是否与当前项目一致\n • iOS Bundle ID:在 Xcode → Target → General → Bundle Identifier 查看\n • Android 包名:在 android/app/build.gradle → applicationId 查看\n\n2️⃣ 重新创建正确的 API Key(如果 Bundle ID 不同):\n • 在高德开放平台创建新应用\n • 填写正确的 Bundle ID(iOS)或包名(Android)\n • 获取新的 API Key\n\n3️⃣ 配置 API Key(推荐使用 Config Plugin):\n\n在 app.json 中配置:\n{\n \"expo\": {\n \"plugins\": [\n [\n \"expo-gaode-map-navigation\",\n {\n \"androidKey\": \"your-android-key\",\n \"iosKey\": \"your-ios-key\"\n }\n ]\n ]\n }\n}\n\n然后重新构建:\nnpx expo prebuild --clean\nnpx expo run:${platform === 'ios' ? 'ios' : 'android'}\n\n4️⃣ 或在代码中配置:\nExpoGaodeMapModule.initSDK({\n androidKey: 'your-android-key',\n iosKey: 'your-ios-key',\n});`,\n docUrl: `${this.docBaseUrl}/guide/initialization.html`,\n });\n }\n\n /**\n * 权限未授予错误\n */\n static permissionDenied(permissionType: 'location'): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.PERMISSION_DENIED,\n message: '定位权限未授予,无法使用定位功能',\n solution: `请按以下步骤授予权限:\n\n1️⃣ 请求权限:\nimport {ExpoGaodeMapModule} from 'expo-gaode-map-navigation';\n\nconst checkPermission = async () => {\n // 检查权限状态\n const status = await ExpoGaodeMapModule.checkLocationPermission();\n \n if (!status.granted) {\n // 请求权限\n const result = await ExpoGaodeMapModule.requestLocationPermission();\n \n if (!result.granted) {\n // 用户拒绝授权,引导用户去设置\n Alert.alert(\n '需要定位权限',\n '请在设置中开启定位权限以使用地图功能',\n [\n { text: '取消', style: 'cancel' },\n { text: '去设置', onPress: () => Linking.openSettings() }\n ]\n );\n }\n }\n};\n\n2️⃣ iOS 配置(在 app.json 中):\n{\n \"expo\": {\n \"ios\": {\n \"infoPlist\": {\n \"NSLocationWhenInUseUsageDescription\": \"需要获取您的位置信息以显示地图\",\n \"NSLocationAlwaysAndWhenInUseUsageDescription\": \"需要获取您的位置信息\"\n }\n }\n }\n}\n\n3️⃣ Android 配置(Config Plugin 会自动添加):\n使用 expo-gaode-map-navigation 的 Config Plugin 会自动添加必要的权限声明`,\n docUrl: `${this.docBaseUrl}/guide/getting-started.html#权限配置`,\n });\n }\n\n /**\n * 定位失败错误\n */\n static locationFailed(reason?: string): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.LOCATION_FAILED,\n message: `定位失败${reason ? `:${reason}` : ''}`,\n solution: `⚠️ 最常见原因:API Key 与 Bundle ID 不匹配!\n\n请按以下顺序排查:\n\n1️⃣ 检查 API Key 配置(最常见问题):\n • 访问高德开放平台:https://lbs.amap.com/\n • 确认您的应用的 Bundle ID 与当前项目一致\n • iOS Bundle ID:在 Xcode → Target → General → Bundle Identifier\n • Android 包名:在 android/app/build.gradle → applicationId\n \n 如果 Bundle ID 不同,必须在高德平台重新创建应用并获取新 Key\n\n2️⃣ 检查设备 GPS 和网络:\n • 确认设备 GPS 已开启\n • 检查网络连接是否正常\n • 尝试在室外空旷处测试\n\n3️⃣ 检查定位权限:\n • iOS:设置 → 隐私 → 定位服务 → 允许应用访问\n • Android:设置 → 应用 → 权限管理 → 位置信息\n\n4️⃣ 配置定位参数(如果 API Key 正确但定位仍失败):\nExpoGaodeMapModule.setLocationTimeout(30); // 增加超时时间\nExpoGaodeMapModule.setInterval(2000); // 设置定位间隔\n\n// Android 特有配置\nExpoGaodeMapModule.setLocationMode(2); // 高精度模式\nExpoGaodeMapModule.setGpsFirst(true); // GPS 优先\n\n// iOS 特有配置\nExpoGaodeMapModule.setDesiredAccuracy(0); // 最佳精度`,\n docUrl: `${this.docBaseUrl}/api/location.html`,\n });\n }\n\n /**\n * 原生模块不可用错误\n */\n static nativeModuleUnavailable(): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.NATIVE_MODULE_UNAVAILABLE,\n message: 'expo-gaode-map-navigation 原生模块不可用',\n solution: `请检查以下步骤:\n\n1️⃣ 确认已正确安装:\nnpm install expo-gaode-map-navigation\n# 或\nbun install expo-gaode-map-navigation\n\n2️⃣ 重新构建原生代码:\nnpx expo prebuild --clean\nnpx expo run:android\nnpx expo run:ios\n\n3️⃣ 检查 Expo 版本兼容性:\n• expo-gaode-map-navigation 需要 Expo SDK 49+\n• 不支持 Expo Go,必须使用 Development Build\n\n4️⃣ 检查是否与其他包冲突:\n• 不能同时安装 expo-gaode-map 和 expo-gaode-map-navigation\n• 两个包选择其一使用\n\n5️⃣ 清理缓存后重试:\ncd android && ./gradlew clean && cd ..\ncd ios && pod deintegrate && pod install && cd ..`,\n docUrl: `${this.docBaseUrl}/guide/getting-started.html`,\n });\n }\n\n /**\n * 地图视图未初始化错误\n */\n static mapViewNotInitialized(methodName: string): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.MAP_VIEW_NOT_INITIALIZED,\n message: `无法调用 ${methodName}:地图视图尚未初始化`,\n solution: `请确保:\n\n1️⃣ MapView 已经渲染完成\n2️⃣ 使用 ref 获取地图实例后再调用方法\n\n正确用法:\nimport { MapView, MapViewRef } from 'expo-gaode-map-navigation';\n\nconst App = () => {\n const mapRef = useRef<MapViewRef>(null);\n \n // ❌ 错误:在渲染前调用\n // mapRef.current?.moveCamera(...);\n \n // ✅ 正确:等待地图加载完成\n const handleMapReady = () => {\n mapRef.current?.moveCamera({\n target: { latitude: 39.9, longitude: 116.4 },\n zoom: 15,\n });\n };\n \n return (\n <MapView\n ref={mapRef}\n onMapReady={handleMapReady}\n />\n );\n};`,\n docUrl: `${this.docBaseUrl}/api/mapview.html`,\n });\n }\n\n /**\n * 参数错误\n */\n static invalidParameter(paramName: string, expected: string, received: unknown): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.INVALID_PARAMETER,\n message: `参数 \"${paramName}\" 类型错误`,\n solution: `期望类型:${expected}\n实际接收:${typeof received} (${JSON.stringify(received)})\n\n请检查传入的参数是否符合要求。\n\n💡 提示:\n• 使用 TypeScript 可以在编译时发现类型错误\n• 参考 API 文档了解正确的参数类型`,\n docUrl: `${this.docBaseUrl}/api/`,\n });\n }\n\n /**\n * 网络错误\n */\n static networkError(originalError?: Error): GaodeMapError {\n return new GaodeMapError({\n type: ErrorType.NETWORK_ERROR,\n message: '网络请求失败',\n solution: `请检查:\n\n1️⃣ 网络连接是否正常\n2️⃣ API Key 是否有效\n3️⃣ 是否超出配额限制\n\n💡 如果问题持续,请:\n• 检查高德开放平台控制台\n• 查看 API 调用量和配额\n• 确认 Key 的服务是否已开通`,\n docUrl: `${this.docBaseUrl}/guide/troubleshooting.html`,\n originalError,\n });\n }\n\n /**\n * 包装原生错误,提供更友好的提示\n */\n static wrapNativeError(error: unknown, context: string): GaodeMapError {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const scene = context.includes('MapView') || context.includes('渲染') ? 'map' : 'sdk';\n\n if (\n errorMessage.includes('PRIVACY_NOT_AGREED') ||\n errorMessage.includes('隐私协议未完成确认') ||\n errorMessage.includes('隐私合规校验失败') ||\n errorMessage.includes('555570') ||\n errorMessage.includes('确保调用SDK任何接口前先调用更新隐私合规')\n ) {\n return this.privacyNotAgreed(scene);\n }\n \n // SDK 未初始化相关错误\n if (\n errorMessage.includes('not initialized') ||\n errorMessage.includes('未初始化') ||\n errorMessage.includes('SDK未设置')\n ) {\n return this.sdkNotInitialized();\n }\n \n // API Key 相关错误\n if (\n errorMessage.includes('key') ||\n errorMessage.includes('invalid') ||\n errorMessage.includes('鉴权失败')\n ) {\n return this.invalidApiKey('both');\n }\n \n // 权限相关错误\n if (\n errorMessage.includes('permission') ||\n errorMessage.includes('权限')\n ) {\n return this.permissionDenied('location');\n }\n \n // 定位相关错误\n if (\n errorMessage.includes('location') ||\n errorMessage.includes('定位')\n ) {\n return this.locationFailed(errorMessage);\n }\n \n // 通用错误\n return new GaodeMapError({\n type: ErrorType.INVALID_PARAMETER,\n message: `${context} 失败`,\n solution: `原始错误信息:${errorMessage}\n\n如果问题持续,请:\n1. 查看完整的错误堆栈\n2. 检查 API 调用参数\n3. 提交 Issue:https://github.com/TomWq/expo-gaode-map/issues`,\n originalError: error instanceof Error ? error : undefined,\n });\n }\n}\n\n/**\n * 错误日志工具\n */\nexport class ErrorLogger {\n // 兼容不同环境:Bun/Jest/Node\n private static isEnabled = typeof __DEV__ !== 'undefined' ? __DEV__ : true;\n\n /**\n * 启用/禁用错误日志\n */\n static setEnabled(enabled: boolean) {\n this.isEnabled = enabled;\n }\n\n /**\n * 记录错误\n */\n static log(error: GaodeMapError) {\n if (!this.isEnabled) return;\n\n console.error(error.message);\n \n if (error.originalError) {\n console.error('原始错误:', error.originalError);\n }\n }\n\n /**\n * 记录警告\n */\n static warn(message: string, details?: unknown) {\n if (!this.isEnabled) return;\n \n console.warn(`⚠️ expo-gaode-map-navigation: ${message}`, details || '');\n }\n}\n"]}
@@ -7,6 +7,10 @@ import type { OfflineMapInfo, OfflineMapDownloadConfig, OfflineMapDownloadEvent,
7
7
  * 离线地图管理类
8
8
  */
9
9
  export declare class OfflineMapManager {
10
+ /**
11
+ * 打开高德 3D 地图 SDK 官方离线地图 UI 组件(Android)。
12
+ */
13
+ static openOfflineMapUI(): Promise<void>;
10
14
  /**
11
15
  * 获取所有可下载的城市列表
12
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"OfflineMapManager.d.ts","sourceRoot":"","sources":["../../../src/map/utils/OfflineMapManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OfflineMapManager.d.ts","sourceRoot":"","sources":["../../../src/map/utils/OfflineMapManager.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,12 @@ import ExpoGaodeMapOfflineModule from '../ExpoGaodeMapOfflineModule';
8
8
  */
9
9
  export class OfflineMapManager {
10
10
  // ==================== 地图列表管理 ====================
11
+ /**
12
+ * 打开高德 3D 地图 SDK 官方离线地图 UI 组件(Android)。
13
+ */
14
+ static async openOfflineMapUI() {
15
+ return ExpoGaodeMapOfflineModule.openOfflineMapUI();
16
+ }
11
17
  /**
12
18
  * 获取所有可下载的城市列表
13
19
  */
@@ -1 +1 @@
1
- {"version":3,"file":"OfflineMapManager.js","sourceRoot":"","sources":["../../../src/map/utils/OfflineMapManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 离线地图便捷 API\n * 提供更友好的 API 接口和事件监听\n */\n\nimport ExpoGaodeMapOfflineModule from '../ExpoGaodeMapOfflineModule';\nimport type {\n OfflineMapInfo,\n OfflineMapDownloadConfig,\n OfflineMapDownloadEvent,\n OfflineMapCompleteEvent,\n OfflineMapErrorEvent,\n OfflineMapPausedEvent,\n OfflineMapCancelledEvent,\n OfflineMapStorageInfo,\n} from '../types/offline.types';\n\n/**\n * 离线地图管理类\n */\nexport class OfflineMapManager {\n // ==================== 地图列表管理 ====================\n \n /**\n * 获取所有可下载的城市列表\n */\n static async getAvailableCities(): Promise<OfflineMapInfo[]> {\n return ExpoGaodeMapOfflineModule.getAvailableCities();\n }\n \n /**\n * 获取所有省份列表\n */\n static async getAvailableProvinces(): Promise<OfflineMapInfo[]> {\n return ExpoGaodeMapOfflineModule.getAvailableProvinces();\n }\n \n /**\n * 根据省份代码获取城市列表\n */\n static async getCitiesByProvince(provinceCode: string): Promise<OfflineMapInfo[]> {\n return ExpoGaodeMapOfflineModule.getCitiesByProvince(provinceCode);\n }\n \n /**\n * 获取已下载的地图列表\n */\n static async getDownloadedMaps(): Promise<OfflineMapInfo[]> {\n return ExpoGaodeMapOfflineModule.getDownloadedMaps();\n }\n \n // ==================== 下载管理 ====================\n \n /**\n * 开始下载离线地图\n */\n static async startDownload(config: OfflineMapDownloadConfig): Promise<void> {\n return ExpoGaodeMapOfflineModule.startDownload(config);\n }\n \n /**\n * 暂停下载\n */\n static async pauseDownload(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.pauseDownload(cityCode); \n }\n \n /**\n * 恢复下载\n */\n static async resumeDownload(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.resumeDownload(cityCode);\n }\n \n /**\n * 取消下载\n */\n static async cancelDownload(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.cancelDownload(cityCode);\n }\n \n /**\n * 删除离线地图\n */\n static async deleteMap(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.deleteMap(cityCode);\n }\n \n /**\n * 更新离线地图\n */\n static async updateMap(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.updateMap(cityCode);\n }\n \n /**\n * 检查是否有可用更新\n */\n static async checkUpdate(cityCode: string): Promise<boolean> {\n return ExpoGaodeMapOfflineModule.checkUpdate(cityCode);\n }\n \n // ==================== 状态查询 ====================\n \n /**\n * 检查地图是否已下载\n */\n static async isMapDownloaded(cityCode: string): Promise<boolean> {\n return ExpoGaodeMapOfflineModule.isMapDownloaded(cityCode);\n }\n \n /**\n * 获取地图下载状态\n */\n static async getMapStatus(cityCode: string): Promise<OfflineMapInfo> {\n return ExpoGaodeMapOfflineModule.getMapStatus(cityCode);\n }\n \n /**\n * 获取所有下载任务的总进度\n */\n static async getTotalProgress(): Promise<number> {\n return ExpoGaodeMapOfflineModule.getTotalProgress();\n }\n \n /**\n * 获取当前正在下载的城市列表\n */\n static async getDownloadingCities(): Promise<string[]> {\n return ExpoGaodeMapOfflineModule.getDownloadingCities();\n }\n \n // ==================== 存储管理 ====================\n \n /**\n * 获取离线地图占用的存储空间(字节)\n */\n static async getStorageSize(): Promise<number> {\n return ExpoGaodeMapOfflineModule.getStorageSize();\n }\n \n /**\n * 获取详细的存储信息\n */\n static async getStorageInfo(): Promise<OfflineMapStorageInfo> {\n return ExpoGaodeMapOfflineModule.getStorageInfo();\n }\n \n /**\n * 清理所有离线地图\n */\n static async clearAllMaps(): Promise<void> {\n return ExpoGaodeMapOfflineModule.clearAllMaps();\n }\n \n /**\n * 设置离线地图存储路径\n */\n static setStoragePath(path: string): void {\n ExpoGaodeMapOfflineModule.setStoragePath(path);\n }\n \n /**\n * 获取离线地图存储路径\n */\n static async getStoragePath(): Promise<string> {\n return ExpoGaodeMapOfflineModule.getStoragePath();\n }\n \n // ==================== 批量操作 ====================\n \n /**\n * 批量下载地图\n */\n static async batchDownload(cityCodes: string[], allowCellular = false): Promise<void> {\n return ExpoGaodeMapOfflineModule.batchDownload(cityCodes, allowCellular);\n }\n \n /**\n * 批量删除地图\n */\n static async batchDelete(cityCodes: string[]): Promise<void> {\n return ExpoGaodeMapOfflineModule.batchDelete(cityCodes);\n }\n \n /**\n * 批量更新地图\n */\n static async batchUpdate(cityCodes: string[]): Promise<void> {\n return ExpoGaodeMapOfflineModule.batchUpdate(cityCodes);\n }\n \n /**\n * 暂停所有下载任务\n */\n static async pauseAllDownloads(): Promise<void> {\n return ExpoGaodeMapOfflineModule.pauseAllDownloads();\n }\n \n /**\n * 恢复所有下载任务\n */\n static async resumeAllDownloads(): Promise<void> {\n return ExpoGaodeMapOfflineModule.resumeAllDownloads();\n }\n \n // ==================== 事件监听 ====================\n \n /**\n * 监听下载进度事件\n */\n static addDownloadProgressListener(\n listener: (event: OfflineMapDownloadEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadProgress', listener);\n }\n \n /**\n * 监听下载完成事件\n */\n static addDownloadCompleteListener(\n listener: (event: OfflineMapCompleteEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadComplete', listener);\n }\n \n /**\n * 监听下载错误事件\n */\n static addDownloadErrorListener(\n listener: (event: OfflineMapErrorEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadError', listener);\n }\n \n /**\n * 监听下载暂停事件\n */\n static addDownloadPausedListener(\n listener: (event: OfflineMapPausedEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadPaused', listener);\n }\n \n /**\n * 监听下载取消事件\n */\n static addDownloadCancelledListener(\n listener: (event: OfflineMapCancelledEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadCancelled', listener);\n }\n \n /**\n * 移除所有监听器\n */\n static removeAllListeners(): void {\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadProgress');\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadComplete');\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadError');\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadPaused');\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadCancelled');\n }\n}\n\n/**\n * 默认导出管理类\n */\nexport default OfflineMapManager;\n"]}
1
+ {"version":3,"file":"OfflineMapManager.js","sourceRoot":"","sources":["../../../src/map/utils/OfflineMapManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AAYrE;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAC5B,mDAAmD;IAEnD;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB;QAC3B,OAAO,yBAAyB,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,kBAAkB;QAC7B,OAAO,yBAAyB,CAAC,kBAAkB,EAAE,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,qBAAqB;QAChC,OAAO,yBAAyB,CAAC,qBAAqB,EAAE,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAoB;QACnD,OAAO,yBAAyB,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,iBAAiB;QAC5B,OAAO,yBAAyB,CAAC,iBAAiB,EAAE,CAAC;IACvD,CAAC;IAED,iDAAiD;IAEjD;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAgC;QACzD,OAAO,yBAAyB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAgB;QACzC,OAAO,yBAAyB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,QAAgB;QAC1C,OAAO,yBAAyB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,QAAgB;QAC1C,OAAO,yBAAyB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAgB;QACrC,OAAO,yBAAyB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAgB;QACrC,OAAO,yBAAyB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAgB;QACvC,OAAO,yBAAyB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,iDAAiD;IAEjD;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,QAAgB;QAC3C,OAAO,yBAAyB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAgB;QACxC,OAAO,yBAAyB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB;QAC3B,OAAO,yBAAyB,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,oBAAoB;QAC/B,OAAO,yBAAyB,CAAC,oBAAoB,EAAE,CAAC;IAC1D,CAAC;IAED,iDAAiD;IAEjD;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc;QACzB,OAAO,yBAAyB,CAAC,cAAc,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc;QACzB,OAAO,yBAAyB,CAAC,cAAc,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY;QACvB,OAAO,yBAAyB,CAAC,YAAY,EAAE,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,IAAY;QAChC,yBAAyB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc;QACzB,OAAO,yBAAyB,CAAC,cAAc,EAAE,CAAC;IACpD,CAAC;IAED,iDAAiD;IAEjD;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAmB,EAAE,aAAa,GAAG,KAAK;QACnE,OAAO,yBAAyB,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,SAAmB;QAC1C,OAAO,yBAAyB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,SAAmB;QAC1C,OAAO,yBAAyB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,iBAAiB;QAC5B,OAAO,yBAAyB,CAAC,iBAAiB,EAAE,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,kBAAkB;QAC7B,OAAO,yBAAyB,CAAC,kBAAkB,EAAE,CAAC;IACxD,CAAC;IAED,iDAAiD;IAEjD;;OAEG;IACH,MAAM,CAAC,2BAA2B,CAChC,QAAkD;QAElD,OAAO,yBAAyB,CAAC,WAAW,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,2BAA2B,CAChC,QAAkD;QAElD,OAAO,yBAAyB,CAAC,WAAW,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,wBAAwB,CAC7B,QAA+C;QAE/C,OAAO,yBAAyB,CAAC,WAAW,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,yBAAyB,CAC9B,QAAgD;QAEhD,OAAO,yBAAyB,CAAC,WAAW,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,4BAA4B,CACjC,QAAmD;QAEnD,OAAO,yBAAyB,CAAC,WAAW,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,kBAAkB;QACvB,yBAAyB,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;QACnE,yBAAyB,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;QACnE,yBAAyB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QAChE,yBAAyB,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QACjE,yBAAyB,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;IACtE,CAAC;CACF;AAED;;GAEG;AACH,eAAe,iBAAiB,CAAC","sourcesContent":["/**\n * 离线地图便捷 API\n * 提供更友好的 API 接口和事件监听\n */\n\nimport ExpoGaodeMapOfflineModule from '../ExpoGaodeMapOfflineModule';\nimport type {\n OfflineMapInfo,\n OfflineMapDownloadConfig,\n OfflineMapDownloadEvent,\n OfflineMapCompleteEvent,\n OfflineMapErrorEvent,\n OfflineMapPausedEvent,\n OfflineMapCancelledEvent,\n OfflineMapStorageInfo,\n} from '../types/offline.types';\n\n/**\n * 离线地图管理类\n */\nexport class OfflineMapManager {\n // ==================== 地图列表管理 ====================\n\n /**\n * 打开高德 3D 地图 SDK 官方离线地图 UI 组件(Android)。\n */\n static async openOfflineMapUI(): Promise<void> {\n return ExpoGaodeMapOfflineModule.openOfflineMapUI();\n }\n \n /**\n * 获取所有可下载的城市列表\n */\n static async getAvailableCities(): Promise<OfflineMapInfo[]> {\n return ExpoGaodeMapOfflineModule.getAvailableCities();\n }\n \n /**\n * 获取所有省份列表\n */\n static async getAvailableProvinces(): Promise<OfflineMapInfo[]> {\n return ExpoGaodeMapOfflineModule.getAvailableProvinces();\n }\n \n /**\n * 根据省份代码获取城市列表\n */\n static async getCitiesByProvince(provinceCode: string): Promise<OfflineMapInfo[]> {\n return ExpoGaodeMapOfflineModule.getCitiesByProvince(provinceCode);\n }\n \n /**\n * 获取已下载的地图列表\n */\n static async getDownloadedMaps(): Promise<OfflineMapInfo[]> {\n return ExpoGaodeMapOfflineModule.getDownloadedMaps();\n }\n \n // ==================== 下载管理 ====================\n \n /**\n * 开始下载离线地图\n */\n static async startDownload(config: OfflineMapDownloadConfig): Promise<void> {\n return ExpoGaodeMapOfflineModule.startDownload(config);\n }\n \n /**\n * 暂停下载\n */\n static async pauseDownload(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.pauseDownload(cityCode); \n }\n \n /**\n * 恢复下载\n */\n static async resumeDownload(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.resumeDownload(cityCode);\n }\n \n /**\n * 取消下载\n */\n static async cancelDownload(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.cancelDownload(cityCode);\n }\n \n /**\n * 删除离线地图\n */\n static async deleteMap(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.deleteMap(cityCode);\n }\n \n /**\n * 更新离线地图\n */\n static async updateMap(cityCode: string): Promise<void> {\n return ExpoGaodeMapOfflineModule.updateMap(cityCode);\n }\n \n /**\n * 检查是否有可用更新\n */\n static async checkUpdate(cityCode: string): Promise<boolean> {\n return ExpoGaodeMapOfflineModule.checkUpdate(cityCode);\n }\n \n // ==================== 状态查询 ====================\n \n /**\n * 检查地图是否已下载\n */\n static async isMapDownloaded(cityCode: string): Promise<boolean> {\n return ExpoGaodeMapOfflineModule.isMapDownloaded(cityCode);\n }\n \n /**\n * 获取地图下载状态\n */\n static async getMapStatus(cityCode: string): Promise<OfflineMapInfo> {\n return ExpoGaodeMapOfflineModule.getMapStatus(cityCode);\n }\n \n /**\n * 获取所有下载任务的总进度\n */\n static async getTotalProgress(): Promise<number> {\n return ExpoGaodeMapOfflineModule.getTotalProgress();\n }\n \n /**\n * 获取当前正在下载的城市列表\n */\n static async getDownloadingCities(): Promise<string[]> {\n return ExpoGaodeMapOfflineModule.getDownloadingCities();\n }\n \n // ==================== 存储管理 ====================\n \n /**\n * 获取离线地图占用的存储空间(字节)\n */\n static async getStorageSize(): Promise<number> {\n return ExpoGaodeMapOfflineModule.getStorageSize();\n }\n \n /**\n * 获取详细的存储信息\n */\n static async getStorageInfo(): Promise<OfflineMapStorageInfo> {\n return ExpoGaodeMapOfflineModule.getStorageInfo();\n }\n \n /**\n * 清理所有离线地图\n */\n static async clearAllMaps(): Promise<void> {\n return ExpoGaodeMapOfflineModule.clearAllMaps();\n }\n \n /**\n * 设置离线地图存储路径\n */\n static setStoragePath(path: string): void {\n ExpoGaodeMapOfflineModule.setStoragePath(path);\n }\n \n /**\n * 获取离线地图存储路径\n */\n static async getStoragePath(): Promise<string> {\n return ExpoGaodeMapOfflineModule.getStoragePath();\n }\n \n // ==================== 批量操作 ====================\n \n /**\n * 批量下载地图\n */\n static async batchDownload(cityCodes: string[], allowCellular = false): Promise<void> {\n return ExpoGaodeMapOfflineModule.batchDownload(cityCodes, allowCellular);\n }\n \n /**\n * 批量删除地图\n */\n static async batchDelete(cityCodes: string[]): Promise<void> {\n return ExpoGaodeMapOfflineModule.batchDelete(cityCodes);\n }\n \n /**\n * 批量更新地图\n */\n static async batchUpdate(cityCodes: string[]): Promise<void> {\n return ExpoGaodeMapOfflineModule.batchUpdate(cityCodes);\n }\n \n /**\n * 暂停所有下载任务\n */\n static async pauseAllDownloads(): Promise<void> {\n return ExpoGaodeMapOfflineModule.pauseAllDownloads();\n }\n \n /**\n * 恢复所有下载任务\n */\n static async resumeAllDownloads(): Promise<void> {\n return ExpoGaodeMapOfflineModule.resumeAllDownloads();\n }\n \n // ==================== 事件监听 ====================\n \n /**\n * 监听下载进度事件\n */\n static addDownloadProgressListener(\n listener: (event: OfflineMapDownloadEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadProgress', listener);\n }\n \n /**\n * 监听下载完成事件\n */\n static addDownloadCompleteListener(\n listener: (event: OfflineMapCompleteEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadComplete', listener);\n }\n \n /**\n * 监听下载错误事件\n */\n static addDownloadErrorListener(\n listener: (event: OfflineMapErrorEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadError', listener);\n }\n \n /**\n * 监听下载暂停事件\n */\n static addDownloadPausedListener(\n listener: (event: OfflineMapPausedEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadPaused', listener);\n }\n \n /**\n * 监听下载取消事件\n */\n static addDownloadCancelledListener(\n listener: (event: OfflineMapCancelledEvent) => void\n ): { remove: () => void } {\n return ExpoGaodeMapOfflineModule.addListener('onDownloadCancelled', listener);\n }\n \n /**\n * 移除所有监听器\n */\n static removeAllListeners(): void {\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadProgress');\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadComplete');\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadError');\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadPaused');\n ExpoGaodeMapOfflineModule.removeAllListeners('onDownloadCancelled');\n }\n}\n\n/**\n * 默认导出管理类\n */\nexport default OfflineMapManager;\n"]}
@@ -14,7 +14,8 @@
14
14
  "MultiPointViewModule",
15
15
  "HeatMapViewModule",
16
16
  "ClusterViewModule",
17
- "ExpoGaodeMapOfflineModule"
17
+ "ExpoGaodeMapOfflineModule",
18
+ "ExpoGaodeMapSearchModule"
18
19
  ]
19
20
  },
20
21
  "android": {
@@ -30,7 +31,8 @@
30
31
  "expo.modules.gaodemap.map.overlays.MultiPointViewModule",
31
32
  "expo.modules.gaodemap.map.overlays.HeatMapViewModule",
32
33
  "expo.modules.gaodemap.map.overlays.ClusterViewModule",
33
- "expo.modules.gaodemap.map.ExpoGaodeMapOfflineModule"
34
+ "expo.modules.gaodemap.map.ExpoGaodeMapOfflineModule",
35
+ "expo.modules.gaodemap.map.search.ExpoGaodeMapSearchModule"
34
36
  ]
35
37
  }
36
38
  }
@@ -442,6 +442,7 @@ public class ExpoGaodeMapNaviView: ExpoView {
442
442
  private var hasLoggedMissingBackgroundAudioMode: Bool = false
443
443
  private var renderedCustomWaypointAnnotations: [AMapNaviCompositeCustomAnnotation] = []
444
444
  private var customWaypointMarkers: [NaviCustomWaypointMarkerModel] = []
445
+ private let customSpeechSynthesizer = AVSpeechSynthesizer()
445
446
 
446
447
  private enum LaneStringKind {
447
448
  case background
@@ -1231,10 +1232,6 @@ public class ExpoGaodeMapNaviView: ExpoView {
1231
1232
  }
1232
1233
 
1233
1234
  private func resolveTravelTurnIconImage(iconType: Int) -> UIImage? {
1234
- let iconEnum = AMapNaviIconType(rawValue: iconType) ?? .none
1235
- if activeScene == .ride {
1236
- return AMapNaviRideView.rideViewTurnIconImage(with: iconEnum)
1237
- }
1238
1235
  return fallbackTurnIconImage(iconType: iconType)
1239
1236
  }
1240
1237
 
@@ -1637,11 +1634,7 @@ public class ExpoGaodeMapNaviView: ExpoView {
1637
1634
  let resizedImage = self?.resizeImageIfNeeded(image, targetSize: self?.carImageSize) ?? image
1638
1635
  driveView?.setCarImage(resizedImage)
1639
1636
  walkView?.setCarImage(resizedImage)
1640
- if let resizedImage {
1641
- rideView?.setCarImageWithSize(resizedImage)
1642
- } else {
1643
- rideView?.setCarImage(nil)
1644
- }
1637
+ rideView?.setCarImage(resizedImage)
1645
1638
  }
1646
1639
  }
1647
1640
 
@@ -2323,18 +2316,24 @@ public class ExpoGaodeMapNaviView: ExpoView {
2323
2316
  }
2324
2317
 
2325
2318
  func playCustomTTS(text: String, forcePlay: Bool, promise: Promise) {
2326
- guard let manager = currentNaviManager() else {
2319
+ guard currentNaviManager() != nil else {
2327
2320
  promise.reject("NAVI_MANAGER_UNAVAILABLE", "导航管理器尚未初始化")
2328
2321
  return
2329
2322
  }
2330
- let success = manager.playTTS(text, forcePlay: forcePlay)
2331
- if success {
2332
- promise.resolve([
2333
- "success": true
2334
- ])
2335
- } else {
2336
- promise.reject("PLAY_TTS_FAILED", "当前场景暂不支持或正在播报其他导航语音")
2323
+
2324
+ if forcePlay {
2325
+ customSpeechSynthesizer.stopSpeaking(at: .immediate)
2326
+ } else if customSpeechSynthesizer.isSpeaking {
2327
+ promise.reject("PLAY_TTS_FAILED", "当前正在播报其他导航语音")
2328
+ return
2337
2329
  }
2330
+
2331
+ let utterance = AVSpeechUtterance(string: text)
2332
+ utterance.voice = AVSpeechSynthesisVoice(language: "zh-CN")
2333
+ customSpeechSynthesizer.speak(utterance)
2334
+ promise.resolve([
2335
+ "success": true
2336
+ ])
2338
2337
  }
2339
2338
 
2340
2339
  // MARK: - Lifecycle
@@ -24,9 +24,10 @@ Pod::Spec.new do |s|
24
24
  s.static_framework = true
25
25
 
26
26
  s.dependency 'ExpoModulesCore'
27
- s.dependency 'AMapNavi'
27
+ s.dependency 'AMapNavi','= 11.1.200'
28
28
  s.dependency 'AMapFoundation'
29
29
  s.dependency 'AMapLocation'
30
+ s.dependency 'AMapSearch'
30
31
 
31
32
  s.library = 'c++'
32
33
 
@@ -2,6 +2,8 @@ import ExpoModulesCore
2
2
  import AMapFoundationKit
3
3
  import AMapNaviKit
4
4
  import Foundation
5
+ import AMapNaviKit
6
+ import UIKit
5
7
 
6
8
  /**
7
9
  * 高德地图离线地图模块 (iOS)
@@ -66,6 +68,12 @@ public class ExpoGaodeMapOfflineModule: Module {
66
68
  self.downloadingCities.removeAll()
67
69
  self.pausedCities.removeAll()
68
70
  }
71
+
72
+ AsyncFunction("openOfflineMapUI") { (promise: Promise) in
73
+ DispatchQueue.main.async {
74
+ self.openOfflineMapUI(promise: promise)
75
+ }
76
+ }
69
77
 
70
78
  // ==================== 1. 地图列表管理 ====================
71
79
 
@@ -383,6 +391,59 @@ public class ExpoGaodeMapOfflineModule: Module {
383
391
 
384
392
  return offlineMapManager
385
393
  }
394
+
395
+ private func openOfflineMapUI(promise: Promise) {
396
+ guard getOfflineMapManager() != nil else {
397
+ promise.reject("ERR_SETUP", "Setup failed")
398
+ return
399
+ }
400
+
401
+ guard let detailViewController = MAOfflineMapViewController.sharedInstance() else {
402
+ promise.reject("ERR_OFFLINE_MAP_UI", "Offline map UI is unavailable")
403
+ return
404
+ }
405
+
406
+ guard let presenter = currentPresenterViewController() else {
407
+ promise.reject("ERR_NO_VIEW_CONTROLLER", "No active view controller")
408
+ return
409
+ }
410
+
411
+ if let navigationController = presenter as? UINavigationController {
412
+ navigationController.pushViewController(detailViewController, animated: true)
413
+ } else if let navigationController = presenter.navigationController {
414
+ navigationController.pushViewController(detailViewController, animated: true)
415
+ } else {
416
+ let navigationController = UINavigationController(rootViewController: detailViewController)
417
+ presenter.present(navigationController, animated: true)
418
+ }
419
+ promise.resolve(nil)
420
+ }
421
+
422
+ private func currentPresenterViewController() -> UIViewController? {
423
+ guard let scene = UIApplication.shared.connectedScenes
424
+ .compactMap({ $0 as? UIWindowScene })
425
+ .first(where: { $0.activationState == .foregroundActive }) else {
426
+ return topViewController(from: UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.rootViewController)
427
+ }
428
+
429
+ let root = scene.windows.first(where: { $0.isKeyWindow })?.rootViewController
430
+ ?? scene.windows.first?.rootViewController
431
+ return topViewController(from: root)
432
+ }
433
+
434
+ private func topViewController(from root: UIViewController?) -> UIViewController? {
435
+ guard let root else { return nil }
436
+ if let presented = root.presentedViewController {
437
+ return topViewController(from: presented)
438
+ }
439
+ if let navigationController = root as? UINavigationController {
440
+ return topViewController(from: navigationController.visibleViewController)
441
+ }
442
+ if let tabBarController = root as? UITabBarController {
443
+ return topViewController(from: tabBarController.selectedViewController)
444
+ }
445
+ return root
446
+ }
386
447
 
387
448
  private func ensureSetup(completion: @escaping (Bool) -> Void) {
388
449
  guard let manager = getOfflineMapManager() else {