# 【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
**问题优先级**: 高 (影响鸿蒙用户使用)
**期望响应时间**: 尽快
---
感谢微信团队的关注和支持! 🙏

提供下复现方式
我们也遇到了相同的问题,官方能解释下吗?
微信小程序中的webview页面使用jssdk无法打开相册和拍照? - 微信开放社区 https://developers.weixin.qq.com/community/develop/doc/0004022f908738e82914ed39a6b000