文章目录
小程序中不免许多地方需要用户授权,比如获取地理位置、微信步数、用户信息等等。但是授权是怎样的流程,在哪些情况下会弹框询问授权,授权状态分为哪几种,在下文中可以找到答案。
这个是小程序官方关于授权部分的内容(个人觉得不是特别清晰,并没有说明如何操作):
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html
(1) 授权状态
根据上文链接,获取用户授权设置可以使用wx.getSetting获取用户当前的授权状态。
wx.getSetting({
success:function(res){
if (res.authSetting['scope.userInfo']) {
}else{
}
}
})
res.authSetting['scope.userInfo']值代表的含义如下:
· true:之前已[通过]授权
· false:之前已[拒绝]授权
· undefined: [未询问]过是否授权
(2) 发起授权流程
下图,以获取微信步数为例,展示了整个发起授权的一般流程。
[1] 查询授权状态
· 如果是false,提示请开启步数权限
用户可以在小程序设置界面(「右上角」 - 「关于」 - 「右上角」 - 「设置」)中控制对该小程序的授权状态(一般人都不知道)。
在2018年10月10日前提交发布的小程序,开发者可以调用wx.openSetting打开设置界面,引导用户开启授权。但在这之后,这个接口被禁用了,需要用户发生点击行为后,才可以跳转打开设置页,管理授权信息。详情参看官方说明:
https://developers.weixin.qq.com/community/develop/doc/000cea2305cc5047af5733de751008
· 如果是true或者undefined,通过wx.authorize发起授权请求
[2] wx.authorize弹框发起授权请求
调用后会立刻弹窗询问用户是否授权,如果之前已经同意,则不会弹框,直接执行success中的内容。
【特别注意】获取用户信息wx.authorize({scope: "scope.userInfo"}),无法弹出授权窗口,需要使用<button open-type="getUserInfo"/>
例如:
<button open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="onGotUserInfo" >获取用户信息</button>
Page({
onGotUserInfo: function(e) {
//获取用户信息
},
onLoad: function (options) {
//用户登录
}
})
· fail: 用户点击拒绝授权,提示请开启步数权限
· success: 用户点击同意授权,调用微信获取步数接口
[3] wx.getWeRunData请求微信步数
这里需要特别说明的是,即使没有调用wx.authorize,直接调用wx.getWeRunData也会弹框发起授权请求。那为什么要多此一举呢?
经过这样的流程就会发现不调用wx.authorize的bug:
关闭微信运动并清除所有缓存-> 直接调用wx.getWeRunData后会出现启用微信运动的页面,点击启用-> 此时会弹出授权微信步数的框,点击拒绝-> 这时会提示开启“微信运动”(但是,这时的微信运动已经是开启了,说明错误提示错了)
为什么会出现这个bug?
因为不管是用户没有授权还是微信运动没有开启都是请求步数失败的情况,都会到fail的回调里,如果要分出是哪种情况,需要再次调用查看授权的状态,那么跟第一步是重复的,所以还是需要使用wx.authorize,除非调用失败的情况不进行任何提示。