uniapp微信小程序保存图片权限获取失败一直走fail?本地能保存,线上版就不行! 原来是这个问题!

588 阅读1分钟

问题背景

最近上线微信小程序遇到一个很头疼的问题:小程序本地测试调用wx.saveImageToPhotosAlbum保存图片到相册,一切都很顺利。然而当将小程序发布到线上后,保存图片的功能却无法正常获取权限,打开调试日志报错如下,saveImageToPhotosAlbum:fail appid privacy api banned", "errno": 1025,设置里小程序已经有"添加到相册"的权限

image.png

排查过程

  1. 首先,检查了代码wx.saveImageToPhotosAlbum的调用逻辑和权限申请都没问题
  2. 接着,在开发版和体验版进行对比测试:结果在开发版和体验版中,图片保存功能是完全正常的,权限申请也没有问题

最终发现

经过反复查找和排查,终于发现问题所在:提交审核时没有勾选 "采集用户隐私",这是导致线上版无法获取权限的根本原因。

在微信小程序的开发版和体验版中,权限校验较为宽松,而发布上线后的小程序则有更严格的权限控制,特别是在涉及到用户隐私的操作时。如果未勾选采集用户隐私"选项,线上版的小程序就无法正确处理相关权限。

解决方法

要解决这个问题,只需要在小程序后台提交审核时,确保勾选了"采集用户隐私", 并配置后相关的隐私条款。

image.png

image.png

参考代码

下面是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();
                }
            });
  }