- 鸿蒙小程序 webview 中JSSDKchooseImage permissiondenied?
# 【Bug反馈】鸿蒙系统小程序 webview 中 JSSDK chooseImage 报 permission denied ## 问题类型 - [x] Bug反馈 ## 问题平台 - [ ] iOS - [ ] Android - [x] 鸿蒙 (HarmonyOS/OpenHarmony) ## 问题分类 - [x] 小程序 - [x] JSSDK - [ ] 公众号 - [ ] 其他 --- ## 问题描述 在微信小程序的 `<web-view>` 组件中加载 H5 页面,通过微信 JSSDK 调用 `wx.chooseImage` API 时,**鸿蒙系统设备**返回 `permission denied` 错误,而 iOS 和 Android 设备运行正常。 ### 复现步骤 1. 在鸿蒙系统手机上打开微信 2. 进入小程序,加载包含 webview 的页面 3. H5 页面中通过 JSSDK 调用 `wx.chooseImage` 4. 报错: `chooseImage:permission denied` ### 预期结果 应该能正常打开相机或相册选择图片,与 iOS/Android 行为一致。 ### 实际结果 返回错误: `chooseImage:permission denied` --- ## 环境信息 ### 鸿蒙设备信息 ``` 系统版本: OpenHarmony 5.0 浏览器引擎: ArkWeb/4.1.6.1 微信版本: MicroMessenger/8.0.11.34 (0xf3800b22) 小程序 SDK: MMWEBSDK/202509080006 User Agent: Mozilla/5.0 (Phone; OpenHarmony 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 ArkWeb/4.1.6.1 Mobile miniProgram/wx6c5faa3cd75ec6d6 MicroMessenger/8.0.11.34 ``` ### 小程序信息 ``` 小程序基础库版本: 2.19.0 JSSDK 版本: jweixin-1.6.1.js 小程序框架: Remax 2.0.0 ``` ### 对比测试 | 平台 | 系统版本 | 微信版本 | 测试结果 | |------|----------|----------|----------| | iOS | 15.0+ | 8.0.x | ✅ 正常 | | Android | 10.0+ | 8.0.x | ✅ 正常 | | 鸿蒙 (OpenHarmony) | 5.0 | 8.0.11.34 | ❌ permission denied | --- ## 代码示例 ### 小程序 webview 加载 ```tsx // 小程序页面 import { WebView } from 'remax/wechat'; <WebView src="https://h5-q.example.com/#/home?userId=xxx" /> ``` ### H5 页面 JSSDK 配置 ```javascript // 1. 加载 JSSDK <script src="https://res.wx.qq.com/open/js/jweixin-1.6.1.js"></script> // 2. 获取签名配置 fetch('/api/wx/getWxConfigParams', { method: 'GET', params: { url: window.location.href.split('#')[0] } }).then(data => { const { appId, timestamp, nonceStr, signature } = data; // 3. 配置 wx.config wx.config({ debug: false, appId: appId, // 公众号 appId timestamp: timestamp, nonceStr: nonceStr, signature: signature, jsApiList: [ 'chooseImage', 'getLocalImgData', 'uploadImage', 'getLocation' ] }); // 4. ready 回调 wx.ready(() => { console.log('JSSDK 初始化成功'); // 5. 权限检查 wx.checkJsApi({ jsApiList: ['chooseImage'], success: function(res) { console.log('checkJsApi:', res); // 鸿蒙系统返回: { checkResult: { chooseImage: true } } // ⚠️ 返回 true,但实际调用失败! } }); }); wx.error(function(res){ console.error('config 失败:', res); }); }); // 6. 调用 chooseImage function takePhoto() { wx.chooseImage({ count: 1, sizeType: ['compressed'], sourceType: ['camera'], success: function (res) { console.log('选择成功:', res); }, fail: function (error) { // ❌ 鸿蒙系统在这里失败 console.error('失败:', error); // 输出: { errMsg: "chooseImage:permission denied" } } }); } ``` ### 小程序权限配置 ```javascript // app.config.ts / app.json { "permission": { "scope.userLocation": { "desc": "你的位置信息将用于打卡定位" }, "scope.album": { "desc": "需要访问你的相册,用于上传图片" }, "scope.camera": { "desc": "需要访问你的相机,用于拍照" } }, "requiredPrivateInfos": [ "getLocation", "onLocationChange", "chooseAddress", "choosePoi", "chooseLocation" ] } ``` --- ## 测试日志 ### 完整的控制台输出 ``` ======== 微信 JSSDK 配置开始 ======== 微信配置 - 原始URL: https://h5-q.example.com/#/home?userId=xxx 微信配置 - 签名URL: https://h5-q.example.com/ 微信配置 - User Agent: Mozilla/5.0 (Phone; OpenHarmony 5.0)... 微信配置 - 是否鸿蒙系统: true ======================================== ✅ wx.config 执行成功 ✅ wx.ready 回调触发 ✅ wx.checkJsApi 返回: { checkResult: { chooseImage: true } } --- 调用 wx.chooseImage --- ❌ fail 回调触发 错误信息: { errMsg: "chooseImage:permission denied" } ``` --- ## 🎯 决定性证据 (关键发现) ### 微信官方 Demo 测试 为了排除我们代码的问题,我们进行了一个关键测试: **测试方法**: 将微信官方的标准 Demo 页面直接嵌入到我们的小程序 webview 中 ```tsx // 小程序 webview 页面 <WebView src="https://www.weixinsxy.com/jssdk/" /> ``` **测试结果**: ``` ✅ iOS 设备: 官方 Demo 的 chooseImage 正常工作 ✅ Android 设备: 官方 Demo 的 chooseImage 正常工作 ❌ 鸿蒙设备: 官方 Demo 的 chooseImage 同样失败! ``` ### 测试结论 > **即使是微信官方的标准 Demo,在鸿蒙系统的小程序 webview 中也无法使用 chooseImage API!** 这个测试彻底证明: 1. ✅ 问题与开发者的代码实现无关 2. ✅ 问题与配置方式无关 3. ✅ 问题与签名算法无关 4. ✅ 问题与业务域名配置无关 5. ❌ **这是鸿蒙系统微信小程序 webview 环境的系统性兼容问题** ### 证据链 | 测试场景 | iOS | Android | 鸿蒙 | 结论 | |---------|-----|---------|------|------| | 我们的实现 | ✅ | ✅ | ❌ | 可能是实现问题 | | **微信官方 Demo** | ✅ | ✅ | ❌ | **排除所有人为因素** | | 官方 Demo (浏览器直接访问) | ✅ | ✅ | ✅ | 非 webview 环境正常 | | 官方 Demo (小程序 webview) | ✅ | ✅ | ❌ | **webview 环境问题** | --- ## 问题分析 ### 关键发现 1. ✅ **wx.config**: 配置成功,debug 模式下显示 "config:ok" 2. ✅ **wx.ready**: 回调正常触发 3. ✅ **wx.checkJsApi**: 返回 `chooseImage: true` (表示可用) 4. ❌ **实际调用**: `wx.chooseImage` 返回 `permission denied` ### 判断依据 - 所有配置检查都通过 - iOS/Android 设备相同代码运行正常 - 仅鸿蒙系统出现此问题 - **`wx.checkJsApi` 返回 true 但实际调用失败,说明存在误判** ### 猜测原因 1. **ArkWeb 引擎兼容性**: 鸿蒙系统使用 ArkWeb 引擎,可能与 JSSDK 的权限验证机制不兼容 2. **权限模型差异**: 鸿蒙的权限模型与 iOS/Android 存在差异,JSSDK 未正确适配 3. **底层 API 实现差异**: ArkWeb 对相机/相册 API 的实现可能与标准浏览器不同 --- ## 已尝试的解决方案 ### 方案 1: 升级 JSSDK 版本 - 从 jweixin-1.6.0.js 升级到 **jweixin-1.6.1.js** - 结果: ❌ 问题依旧 ### 方案 2: 启用 beta 接口 ```javascript wx.config({ beta: true, // 启用 beta 接口 // ...其他配置 }); ``` - 结果: ❌ 问题依旧 ### 方案 3: 延迟初始化 ```javascript wx.ready(() => { setTimeout(() => { // 延迟 300ms 后再初始化 init(); }, 300); }); ``` - 结果: ❌ 问题依旧 ### 方案 4: 手动授权手机权限 - 在鸿蒙手机设置中手动开启微信的相机、存储权限 - 结果: ❌ 问题依旧 ### 方案 5: 升级小程序基础库 - 从 2.3.1 升级到 **2.19.0** - 结果: ❌ 问题依旧 ### 方案 6: 完整的 jsApiList ```javascript jsApiList: [ 'scanQRCode', 'getLocation', 'downloadImage', 'chooseImage', 'getLocalImgData', 'uploadImage', 'previewImage' ] ``` - 结果: ❌ 问题依旧 --- ## 相关问题 我在社区中看到了类似的问题反馈: - [web-view,引入jweixin-1.6.0.js, 无法调用相机](https://developers.weixin.qq.com/community/develop/doc/0004cade9d8190cadce23c06b68c00) 该问题反馈者也遇到了鸿蒙设备上 `chooseImage:permission denied` 的问题,但似乎尚未得到官方回复或解决方案。 --- ## 期望 1. **官方确认**: 确认这是鸿蒙系统与微信 JSSDK 的兼容性问题 2. **修复计划**: 提供修复时间表或临时解决方案 3. **适配指南**: 发布鸿蒙系统的 JSSDK 适配文档 4. **版本支持**: 在后续版本中完善对鸿蒙系统的支持 --- ## 补充信息 ### 业务域名配置 - ✅ 小程序后台已配置业务域名: `h5-q.example.com` - ✅ 公众号已配置 JS 安全域名: `h5-q.example.com` ### 权限授权 - ✅ 小程序已在设置中授予相机、相册权限 - ✅ 手机系统设置中微信的相机、存储权限已开启 ### 签名验证 - ✅ 签名算法按照官方文档实现 - ✅ iOS/Android 设备验证签名正确 **提交日期**: 2025-10-16 **问题优先级**: 高 (影响鸿蒙用户使用) **期望响应时间**: 尽快 --- 感谢微信团队的关注和支持! 🙏
10-16 - 审核不过,代码中无使用位置相关,还是被驳回?
被驳回 N次,一直说提审小程序代码包中地理位置相关接口( wx.chooseAddress、wx.chooseLocation、wx.onLocationChange )暂未开通,建议完成接口开通后或移除接口相关内容后再进行后续版本提审。涉及到位置相关的代码都已经删除完了,全局都找不到这些方法,为啥还是一直这么提示。 小程序APPID wx6c5faa3cd75ec6d6 快被逼疯了都。
2022-06-10