微信小程序的部分接口需要经过用户授权同意才能调用。我们把这些接口按使用范围分成多个 scope ,用户选择对 scope 来进行授权,当授权给一个 scope 之后,其对应的所有接口都可以直接使用。
此类接口调用时:
如果用户未接受或拒绝过此权限,会弹窗询问用户,用户点击同意后方可调用接口;
如果用户已授权,可以直接调用接口;
如果用户已拒绝授权,则不会出现弹窗,而是直接进入接口 fail 回调。请开发者兼容用户拒绝授权的场景。
开发者可以使用 wx.getSetting 获取用户当前的授权状态。
用户可以在小程序设置界面(「右上角」 - 「关于」 - 「右上角」 - 「设置」)中控制对该小程序的授权状态。
开发者可以调用 wx.openSetting 打开设置界面,引导用户开启授权。
开发者可以使用 wx.authorize 在调用需授权 API 之前,提前向用户发起授权请求。
scope | 对应接口 | 描述 |
---|---|---|
scope.userInfo | wx.getUserInfo | 用户信息 |
scope.userLocation | wx.getLocation, wx.chooseLocation | 地理位置 |
scope.userLocationBackground | wx.startLocationUpdateBackground | 后台定位 |
scope.address | wx.chooseAddress | 通讯地址 |
scope.invoiceTitle | wx.chooseInvoiceTitle | 发票抬头 |
scope.invoice | wx.chooseInvoice | 获取发票 |
scope.werun | wx.getWeRunData | 微信运动步数 |
scope.record | wx.startRecord | 录音功能 |
scope.writePhotosAlbum | wx.saveImageToPhotosAlbum, wx.saveVideoToPhotosAlbum | 保存到相册 |
scope.camera | camera 组件 | 摄像头 |
一旦用户明确同意或拒绝过授权,其授权关系会记录在后台,直到用户主动删除小程序。
在真正需要使用授权接口时,才向用户发起授权申请,并在授权申请中说明清楚要使用该功能的理由。
wx.authorize({scope: "scope.userInfo"}),不会弹出授权窗口,请使用 <button open-type="getUserInfo"/>
需要授权 scope.userLocation、scope.userLocationBackground 时必须配置地理位置用途说明。在全局的app.json文件里配置permission:
{ "pages": ["pages/index/index"], "permission": { "scope.userLocation": { "desc": "你的位置信息将用于小程序位置接口的效果展示" // 高速公路行驶持续后台定位 } } }
与其它类型授权不同的是,scope.userLocationBackground 不会弹窗提醒用户。需要用户在设置页中,主动将“位置信息”选项设置为“使用小程序期间和离开小程序后”。开发者可以通过调用wx.openSetting,打开设置页。
飘易封装了一下获取授权的方法,可以供开发者在需要的地方方便地调用授权:
/* * 检查权限 * scope: 权限字符串,如 scope.writePhotosAlbum * msg: 提示字符串,如 保存到系统相册需要授权 * callback: 回调函数 */ checkScope: function (scope, msg, callback) { //查询权限 wx.showLoading({ title: '检查授权情况', mask: true }) wx.getSetting({ success(res) { wx.hideLoading(); if (!res.authSetting[scope]) { // 请求授权 wx.authorize({ scope: scope, success() { // 获得授权 typeof callback === 'function' && callback(); }, fail() { wx.showModal({ content: msg,//'保存到系统相册需要授权', confirmText: '授权', showCancel: false, success(res) { if (res.confirm) { wx.openSetting({ success(res) { if (res.authSetting[scope] === true) { typeof callback === 'function' && callback(); } } }) } }, fail() { wx.showToast({ title: '打开设置页失败', icon: 'none', }) } }) } }) } else { //已有授权 typeof callback === 'function' && callback(); } }, fail() { wx.hideLoading(); wx.showToast({ title: '获取授权失败', icon: 'none', }) } }) },
注意:getUserInfo 和 userLocationBackground 需要特殊的处理。
【参考】:
* 小程序授权文档