问题背景
最近上线微信小程序遇到一个很头疼的问题:小程序本地测试调用wx.saveImageToPhotosAlbum保存图片到相册,一切都很顺利。然而当将小程序发布到线上后,保存图片的功能却无法正常获取权限,打开调试日志报错如下,saveImageToPhotosAlbum:fail appid privacy api banned", "errno": 1025,设置里小程序已经有"添加到相册"的权限
排查过程
- 首先,检查了代码wx.saveImageToPhotosAlbum的调用逻辑和权限申请都没问题
- 接着,在开发版和体验版进行对比测试:结果在开发版和体验版中,图片保存功能是完全正常的,权限申请也没有问题
最终发现
经过反复查找和排查,终于发现问题所在:提交审核时没有勾选 "采集用户隐私",这是导致线上版无法获取权限的根本原因。
在微信小程序的开发版和体验版中,权限校验较为宽松,而发布上线后的小程序则有更严格的权限控制,特别是在涉及到用户隐私的操作时。如果未勾选采集用户隐私"选项,线上版的小程序就无法正确处理相关权限。
解决方法
要解决这个问题,只需要在小程序后台提交审核时,确保勾选了"采集用户隐私", 并配置后相关的隐私条款。
参考代码
下面是uniapp保存图片到相册的代码实现,和微信小程序开发语言类似
downloadImage(imageUrl) {
console.log('下载图片:', imageUrl);
uni.showLoading({
title: this.$t('downloading'),
mask: true
});
uni.downloadFile({
url: imageUrl, // 图片的url地址
success: (res) => {
if (res.statusCode === 200) {
// 获取临时文件路径
const tempFilePath = res.tempFilePath;
// 保存到相册
uni.saveImageToPhotosAlbum({
filePath: tempFilePath,
success: () => {
uni.showToast({
title: this.$t('save_success'),
duration: 3000
});
this.handleClose();
},
fail: (err) => {
console.error('保存到相册失败:', err);
uni.showToast({
title: this.$t('save_photo_failed'),
icon: 'none',
duration: 3000
});
},
complete: () => {
uni.hideLoading();
}
});
}
},
fail: (err) => {
console.error('下载文件失败:', err);
uni.showToast({
title: this.$t('save_failed'),
icon: 'none',
duration: 3000
});
},
complete: () => {
uni.hideLoading();
}
});
}