# 多端应用中 wx.getSetting 兼容处理

在小程序项目升级到多端项目后,开发者会发现 wx.getSettingwx.openSetting 等与设置相关的接口无法运行。

# 一、原因概述

由于多端项目在打包 App 后,运行在移动端时,本身已经脱离了微信的权限体系。开发者的项目只需要向系统(iOS 和 Android)获取权限即可。

wx.getSettingwx.openSetting 是小程序运行在微信客户端时,向微信客户端申请的权限集合获取和打开管理。这两个 API 在多端 App 运行时,无法使用。

# 二、改造过程

因此当我们在多端项目运行时,替换掉 wx.getSettingwx.openSetting 接口。

# 2.1 触发和查看权限

以 camera 为例子,当在多端项目中通过组件或者 API,拉起系统的摄像头时,首次会触发系统的弹窗。

如果用户点击拒绝,则应用后续无法访问相机,开发者可通过 wx.getAppAuthorizeSetting 获取当前应用的权限授权情况。

需要注意:Android 和 iOS 的权限返回有所区别,开发者需根据平台条件判断。

wx.getAppAuthorizeSetting 返回的内容如下:

{
    "cameraAuthorized":"authorized", // 摄像头权限
    "locationAuthorized":"authorized", // 定位权限
    "microphoneAuthorized":"authorized", // 麦克风权限
    "notificationAuthorized":"authorized", // 通知权限
    "phoneCalendarAuthorized":"authorized", // 读写日历权限
    "locationReducedAccuracy":true, // 定位准确度(仅 iOS,true 表示模糊定位,false 表示精确定位)
    "albumAuthorized":"authorized", // 访问相册权限(仅 iOS)
    "bluetoothAuthorized":"authorized", // 蓝牙权限(仅 iOS)
    "notificationAlertAuthorized":"authorized", // 带有提醒的通知权限(仅 iOS)
    "notificationBadgeAuthorized":"authorized", // 带有标记的通知权限(仅 iOS)
    "notificationSoundAuthorized":"authorized", // 带有声音的通知权限(仅 iOS)
}

如果返回的内容值标记为 not determined 表示尚未请求授权,会在 App 下一次调用系统相应权限时自动请求。

返回的内容随着 SDK 的升级可能会有不同,在开发时请直接访问wx.getAppAuthorizeSetting 文档获取最新权限列表。

# 2.2 用户拒绝重新拉起

如果用户明确拒绝了,即返回的权限内容值标记为 denied,则需要调用 wx.openAppAuthorizeSetting 打开 App 的系统权限页,提示用户手动给予相应的权限。

wx.openAppAuthorizeSetting({
    success (res) {
        console.log('打开成功!')
    },
    fail(e){
        console.log('打开失败!')
    }
})

开发者工具无法打开系统权限页,需真机预览这里的实现。正因为如此,开发者工具的所有权限都是 authorized。

# 三、配置隐私访问描述

多端 App 在上架应用市场时,应用市场平台(不是微信多端平台)会对涉及用户隐私的系统权限进行审核确认。当你的应用涉及到隐私相关的 API 调用,则需要在 project.miniapp.json 中配置隐私访问描述。

Android 的隐私配置默认为空,上架前需按照使用需要填写。详情查看此文档

iOS 的隐私配置默认开关需要关闭,上架前需按照使用替换填写。详情查看此文档

在 iOS 中运行时,首次触发权限调用,会自动弹出申请

如果应用上架审时检测到某些权限,但是实际上你并未用到,而应用市场则以你未声明相关用途而驳回时,则可将 project.miniapp.json 切换到 json 格式,然后通过 uselessPermissions 参数移除相关权限项**