微信小程序开发:用户授权最佳实践
在开发微信小程序时,经常会使用页面来获取一些用户权限。例如,如果您想登录,则需要获取个人数据。您需要获得相机权限才能使用人脸识别。要使用位置地图功能,您必须获得 的位置权限。如果要将图片保存到用户相册,需要获得相册权限稍等
微信范围流程:
大部分功能未经许可无法使用。我通常会检查权限是否启用,如果启用则继续使用它们。给出提示并继续执行授权请求。如果还是拒绝,就给出提示,让用户手动去设置页面打开...
正常逻辑
但这组词可以这样写:
wx.getSetting({ success(res)=>{ if (!res.authSetting['scope']) { console.log('未授权') wx.authorize({ scope: 'scope', success() { console.log('授权成功') }, fail() { console.log('授权失败,让用户手动授权') wx.showModal({ title: '温馨提示', content: '未打开xxx权限', showCancel: false, success(res) { if (res.confirm) { console.log('用户点击确定') wx.openSetting({ success(res) { console.log(res.authSetting) res.authSetting = { "scope.camera": true, } } }) } else if (res.cancel) { console.log('用户点击取消') } } }) } }) } else { console.log('已授权') } }, fail(err)=>{} })
现在就这样了已经1202年了。写出来还和业务逻辑混在一起真是太糟糕了~
受不了,所以花了点时间封装一下功能。我只需要传递指定的权限名称即可。它可以检测用户是否开启了权限。如果未打开,系统会提示您。如果提示未打开,请转到设置页面并手动将其打开(无论如何都必须打开)。
本来是要写一段代码片段的,后来发现工具上调用openSetting的时候有问题,只好放弃。
代码详细
// utils/auth.js /** * @param { * authType: 授权类型 * } */ module.exports = async function wxAuth(authType) { // scopeArr ref: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html let scopeArr = [ "userInfo", "userLocation", "userLocationBackground", "address", "invoiceTitle", "invoice", "werun", "record", "writePhotosAlbum", "camera", ]; if (scopeArr.indexOf(authType) == -1) { return console.error("请输入正确的授权类型"); } let scope = "scope." + authType; let isUserSet = await getSettingSync(scope); if (isUserSet) return true; let isAuthorize = await authorizeSync(scope); if (isAuthorize) return true; let showModalMes = await showModalSync(scope); // 弹框提示去授权 if (showModalMes) { // 去手动授权 let openSet = await openSettingSync(scope); if (openSet) { return true; } else { return false; } } else { // 拒绝授权 return false; } }; // 判断用户是否开启该授权 function getSettingSync(scope) { return new Promise((resolve, reject) => { wx.getSetting({ success(res) { if (!res.authSetting[scope]) { console.log("未授权"); resolve(false); } else { console.log("已授权"); resolve(true); } }, fail(err) { reject(); console.error("wx.getSetting Error", err); }, }); }); } // 请求用户授权 function authorizeSync(scope) { return new Promise((resolve, reject) => { wx.authorize({ scope: scope, success() { resolve(true); console.log("授权成功"); }, fail() { resolve(false); console.log("授权失败"); }, }); }); } // 弹框提示用户手动授权 function showModalSync(scope) { return new Promise((resolve, reject) => { wx.showModal({ title: "提示", content: `为了更好的用户体验,请您授权 ${scope} 功能`, confirmText: "去授权", showCancel: false, success(res) { if (res.confirm) { console.log("点击确认"); resolve(true); } else if (res.cancel) { resolve(false); } }, fail(err) { reject(); console.error(err, "wx.showModal Error"); }, }); }); } // 调起客户端小程序设置界面,返回用户设置的操作结果 function openSettingSync(scope) { return new Promise((resolve, reject) => { wx.openSetting({ success(res) { console.log(res.authSetting); if (res.authSetting[scope]) { resolve(true); } else { resolve(false); } }, fail(err) { reject(); console.error(err, "wx.openSetting Error"); }, }); }); }
使用
JS代码参考:
import auth from './../../utils/auth' Page({ data:{ isCameraAuth: false }, onLoad(){ // 授权代码 auth('camera').then(() => { console.log('授权成功') this.setData({ isCameraAuth: true } }).catch((err) => { console.error('授权失败'); }) } })
wxml代码参考:
<!-- index.wxml --> <view>是否授权:{{isCameraAuth}}</view> <camera wx:if="{{isCameraAuth}}" style="width: 100%; height: 300px;"></camera>
预览
我为此做了一个Demo,点击预览中的Demo即可直接使用开发开放预览工具。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。