微信小程序中用户拒绝授权的处理方式

微信小程序中的权限介绍

大家如果接触过移动开发应该都知道,涉及到一些用户敏感信息的操作(比如定位、访问本地文件等)都是需要用户授权的,在Android开发中,我们需要提前将这些权限配置到项目中,Android 6.0及以上版本还需要通过代码来动态申请部分权限。微信小程序也是如此,我们平时使用小程序时可能也见到过进行某个操作之前弹出授权框的场景,需要用户手动授权后才能进行下一步操作。接下来我简单介绍一下微信小程序中的授权机制,基本上都是参考自官方文档,大家也可以直接阅读官方文档,了解更详细的介绍。
微信小程序中所有需要授权的操作和对应的权限关系如下表:

权限说明对应接口
scope.userInfo(获取用户信息)wx.getUserInfo
scope.userLocation(获取地理位置信息)wx.getLocation, wx.chooseLocation
scope.userLocationBackground(后台定位)wx.startLocationUpdateBackground
scope.record(录音)wx.startRecord
scope.writePhotosAlbum(保存文件到相册)wx.saveImageToPhotosAlbum, wx.saveVideoToPhotosAlbum
scope.camera(调用系统摄像头)camera组件
scope.werun(获取微信运动步数)wx.getWeRunData
scope.address(获取收货地址)wx.chooseAddress
scope.invoiceTitle(获取发票抬头)wx.chooseInvoiceTitle
scope.invoice(获取发票信息)wx.chooseInvoice

和Android开发不同的是,微信小程序不需要通过代码来申请权限,在调用上述接口时会自动弹出授权框让用户进行授权。但是需要注意的是,一旦用户选择了拒绝或者允许该权限,那么授权关系就会被记录在后台,直到用户主动删除小程序,之后再次调用该API时都不会再弹出权限申请框。如果用户拒绝了授权,之后调用该API都会失败(执行对应的fail回调),因此我们要根据实际的开发场景处理好用户拒绝授权的情况,如果API的返回值是必需的,那么我们就要在用户拒绝授权后引导用户手动开启该权限从而保证API的成功调用。下面我就以获取位置信息API(wx.getLocation)为例,介绍一下如何处理用户拒绝授权的情况。

如何处理用户拒绝授权的情况

下面就以调用wx.getLocation()获取用户位置信息为例介绍一下用户拒绝授权的处理方式。scope.userLocationscope.userLocationBackground权限比较特殊,需要在小程序根目录下的app.json文件中配置位置信息的用途说明,如下所示:

"permission": {"scope.userLocation": {"desc": "您的位置信息将用于定位"}
}

其中的"desc"就是展示给用户的位置信息用途说明,之后在调用wx.getLocation()时就会弹出如下授权提示框。

当然具体的弹窗样式会和手机系统以及微信版本有关,但是弹窗展示的内容是不变的。根据此前的介绍,当用户点击了“拒绝”后,此后调用wx.getLocation()时都会执行fail失败回调,无法获取用户位置信息,因此我们可以在fail回调中判断用户是否拒绝了授权,对于用户拒绝授权的情况调用wx.openSetting跳转小程序设置页面,引导用户手动开启该权限。判断用户是否拒绝授权的方式有以下两种:

  • 通过wx.getSetting获取用户当前的授权状态来判断

我们可以在wx.getLocation的fail回调中调用wx.getSetting来获取用户当前授权状态,从而判断用户是否拒绝了定位权限,示例代码如下:

wx.getLocation({success: res => {console.log(res);},fail: e => {console.log(e);// 判断用户是否拒绝了授权wx.getSetting({success: res => {if (typeof(res.authSetting['scope.userLocation']) != 'undefined' && !res.authSetting['scope.userLocation']) {// 用户拒绝了授权,跳转设置页面}}});}
});

大家可能会有疑问,为什么不能直接根据!res.authSetting['scope.userLocation']来判断呢?这是因为wx.getSetting的返回值中只会出现小程序已经向用户申请过的权限,换句话说,只有此前弹出过权限申请框,并且用户点击了“拒绝”或者“允许”,之后在wx.getSetting的success回调中才能获取到res.authSetting['scope.userLocation']的值。我们可以考虑这样一种情况,当调用wx.getLocation弹出权限申请框后,用户没有点击“拒绝”或“允许”按钮,而是通过系统返回键关闭了权限申请框,之后也会执行fail回调,但是此时res.authSetting中是没有scope.userLocation属性的,同样满足!res.authSetting['scope.userLocation']条件,这种情况跳转设置页面是不太符合逻辑的。还有一个重要的原因,wx.openSetting同样只会显示小程序已经向用户申请过的权限,因此这种情况即使跳转了设置页面,页面中也不会显示出该权限,当然也无法引导用户手动开启了。

  • 通过返回的错误信息来判断

我们也可以通过wx.getLocation的fail回调返回的错误信息来判断用户是否拒绝了定位权限。拒绝授权返回的错误信息官方文档中并没有写,我们只能通过测试来得到,经过我个人的测试,拒绝定位权限返回的错误信息如下:

微信开发者工具:getLocation:fail auth deny
Android手机用户点击授权框中的“拒绝”按钮:getLocation:fail:auth denied
Android手机用户已拒绝授权,之后每一次调用定位API:getLocation:fail auth deny
苹果手机用户点击授权框中的“拒绝”按钮:getLocation:fail auth deny
苹果手机用户已拒绝授权,之后每一次调用定位API:getLocation:fail authorize no response

这里就不得不吐槽一下了,其实一开始我只在开发工具上进行了测试,错误信息只考虑了一种,后来通过测试人员反馈我才知道原来这也和手机的系统有关,之后我测试了录音的API,也是同样的情况。我确实不能理解为什么同样的情况,不同手机系统返回的错误信息还要有所区别,不过既然小程序是这样设计的,可能也有它的道理吧,如果大家有什么见解或者是我的测试有什么不对的地方欢迎提出。
好了,回到正题,对于用户拒绝定位权限的情况,我们需要同时考虑这三种错误信息,示例代码如下:

wx.getLocation({success: res => {console.log(res);},fail: e => {console.log(e);// 判断用户是否拒绝了授权if (e.errMsg == 'getLocation:fail:auth denied' || e.errMsg == 'getLocation:fail auth deny' || e.errMsg == 'getLocation:fail authorize no response') {// 用户拒绝了授权,跳转设置页面}}
});

由于授权失败对应的错误信息是不唯一的,我也不清楚官方在之后是否会修改,因此我不是很推荐使用这种方式来判断。
之后对于用户拒绝授权的情况就可以调用wx.openSetting打开设置页面,引导用户手动开启权限了。

// 用户拒绝了授权,跳转设置页面
wx.openSetting({success: res => {if (res.authSetting['scope.userLocation']) {// 授权成功,重新定位wx.getLocation({success: res => {}});} else {// 没有允许定位权限wx.showToast({title: '您拒绝了定位权限,将无法使用XX功能',icon: 'none'});}}
});

 在wx.openSetting的success回调中可以判断用户是否已授权,并根据实际开发场景执行相关逻辑,这里为了简单演示,对于用户已授权的情况重新调用wx.getLocation进行定位;对于用户依然没有授权的情况,弹出一个Toast提示。
需要注意,官方文档中明确指出从2.3.0版本开始,当用户发生点击行为后才可以跳转打开设置页,不允许在用户无任何操作的情况下进行跳转,对于该限制,我们可以使用弹出一个模态框,当用户点击确定按钮时再跳转设置页面。最后附上定位的完整代码如下:

wx.getLocation({success: res => {console.log(res);},fail: e => {console.log(e);// 判断用户是否拒绝了授权wx.getSetting({success: res => {if (typeof(res.authSetting['scope.userLocation']) != 'undefined' && !res.authSetting['scope.userLocation']) {// 用户拒绝了授权wx.showModal({title: '提示',content: '您拒绝了定位权限,将无法使用XX功能',success: res => {if (res.confirm) {// 跳转设置页面wx.openSetting({success: res => {if (res.authSetting['scope.userLocation']) {// 授权成功,重新定位wx.getLocation({success: res => {}});} else {// 没有允许定位权限wx.showToast({title: '您拒绝了定位权限,将无法使用XX功能',icon: 'none'});}}});}}});}}});
});

这里使用的是第一种方式判断用户是否拒绝了授权,使用错误信息来判断也是一样的,就不展示了。
最后展示一下运行效果:

总结

由于微信小程序只会向用户申请一次授权,之后的授权记录会一直保留,并且用户拒绝授权会导致相关API调用失败,因此我们需要考虑用户拒绝授权的情况。本文以获取位置信息的API为例,介绍了微信小程序中如何处理这种情况,对于其他权限来说逻辑也是类似的,主要包括两个步骤:
1.判断用户是否拒绝了授权。
2.对于用户拒绝授权的情况,跳转小程序设置页面引导用户手动授权。
具体的处理方式还是要考虑实际项目的功能,如果该权限涉及到的功能不是必需的(比如定位获取到的位置信息可以为空),那么当然可以不用做这些处理,我这里只是提供了一种思路,大体的判断逻辑是不会变的。


转载来源作者:快乐丸
转载链接:https://www.jianshu.com/p/80e33d16182f

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41083.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序-同时获取麦克风、相机权限、获取多个权限

代码仓库&#xff1a;https://gitee.com/DerekAndroid/miniProgramAgen/tree/master/pages/authSetting 效果&#xff1a; wxml: <button bindtap"checkScopeCamera">申请获取相机权限</button> <button bindtap"checkScopeCamera">申…

微信小程序之获取用户位置权限(拒绝后提醒)

微信小程序获取用户当前位置有三个方式&#xff1a; 1. wx.getLocation&#xff08;多与wx.openLocation一起用&#xff09;   获取当前的精度、纬度、速度。不需要授权。当type设置为gcj02 返回可用于wx.openLocation的坐标2. wx.chooseLocation   需要授权&#xff0c;打…

微信小程序之位置信息权限获取和设置界面权限显示

小程序提交审核和发布后&#xff0c;多种机型使用起来发现了一个问题&#xff0c;在小程序设置中没有显示具体的权限信息。如下图所示 当考虑到用户使用小程序时&#xff0c;若缺少对应权限&#xff0c;按照官方案例讲的方式是进行自动导航跳转“设置”页面&#xff0c;让用户手…

微信小程序+权限操作

微信小程序权限操作 在小程序端查询数据(只能查询到用户在小程序中创建的数据&#xff0c;导入的数据是查不到的&#xff1b;要想查到导入的数据需要把数据表中的权限改为所有*用户可读 *) wx.getSetting(Object object) 获取用户的当前设置。返回值中只会出现小程序已经向用户…

【微信小程序】用户授权及getUserProfile接口使用

小程序登录、用户信息相关接口调整说明 为&#xfeff;优化用户的使用体验&#xff0c;平台将进行以下调整&#xff1a; 1&#xff0c;2021年2月23日起&#xff0c;若小程序已在微信开放平台进行绑定&#xff0c;则通过wx.login接口获取的登录凭证可直接换取unionID 2&#xff…

微信小程序授权 获取用户信息

小程序在18年4月25日做了一次更新,不再支持直接弹出授权信息框 具体代码请看这里: >> 获取用户信息(用户信息、获取unionId、openId)请移步到这里 用户打开小程序时&#xff0c;直接弹框获取用户信息授权&#xff0c;可能会立马懵圈&#xff1a; 你是谁&#xff1…

微信小程序之获取用户位置权限

微信小程序获取用户当前位置有三个方式&#xff1a; 1. wx.getLocation 注意&#xff1a; 先要在app.json里配置permission&#xff1a; 不然就会出现以下提示&#xff08;本地测试环境&#xff09;&#xff1a; 配置如下&#xff1a; "permission": {"scope…

发布微信小程序获取收集用户信息权限

前言 在发布微信小程序的时候我们经常会遇到审核不通过的情况&#xff0c;其中一种特别让我头疼就是说小程序收集、使用和储存用户信息。不给予通过。 但是他们的接口又不能提供这个功能&#xff0c;并且老是改动&#xff0c;真的特别的麻烦加无语。有时候审核偷一下懒&#xf…

微信小程序授权登录wx.getUserProfile获取不到昵称及头像解决方案

半年前做的个小程序&#xff0c;更新了二个文字&#xff0c;重新上传审核通过&#xff0c;悲剧了&#xff0c;新用户的昵称全部变为微信用户&#xff0c;头像全部变为默认头像&#xff0c;查了半天代码没找到原因&#xff0c;相当头大&#xff0c;搜了一下文档&#xff0c;尴尬…

小程序中的权限设计

日常我们开发小程序的时候,经常需要考虑权限如何设计,比如在我的页面,管理员可以看到一些菜单,而普通用户可以看到另外一些菜单。那如何设计这种带权限的功能呢?本文就以低代码工具为例,看看低代码中是如何设计小程序的权限的。 1 权限表设计 在通用的RBAC模型中,角色…

chatgpt赋能python:Python画出物体的运动轨迹

Python画出物体的运动轨迹 Python是一种很流行的编程语言&#xff0c;主要用于数据处理、科学计算以及图形绘制。在这篇文章中&#xff0c;我们将探讨如何使用Python画出物体的运动轨迹。 介绍 物体的运动轨迹通常是我们需要关注的问题。当我们在研究物理、机械、运动学、航…

chatgpt赋能python:Python画三维轨迹图:一个引人注目的可视化工具

Python画三维轨迹图&#xff1a;一个引人注目的可视化工具 Python是一种十分适合数据分析及科学计算的编程语言&#xff0c;它的可视化功能非常强大&#xff0c;其中最为出色的一点就是画三维轨迹图。这种图表的本质是一种描绘物体运动轨迹的可视化效果&#xff0c;它可以直观…

英文面试常见问题及回答汇总

今天给大家奉上英文面试常见问题及回答的合集&#xff0c;英语面试主要就是学习如何用英语回答面试常见问题&#xff0c;英文面试常见问题说来说去其实重要的就那么几个&#xff0c;所以今天分享的英文面试常见问题及回答大家只要知道其套路&#xff0c;然后灵活运用就行了。 常…

我的性格类型—— INFP(哲学家型人格 )

测试日期&#xff1a;2019/6/9 基本描述 INFP (Introverted Feeling with Intuition)代表人物&#xff1a;卢梭 语录&#xff1a;虽然我的心既傲慢又温柔&#xff0c;我的性格柔弱&#xff0c;然而&#xff0c;我是不可战胜的。 才储分析&#xff1a;您的性格类型倾向为“…

什么是MBTI,16种人格类型详解

MBTI是Myers-Briggs Type Indicator的缩写&#xff0c;是一种经典的人格类型测评工具&#xff0c;通过对个体心理偏好的测试和分析。 MBTI人格理论认为&#xff0c;人类的人格特征可以从四个角度进行分析&#xff1a;认知功能、信息获取、决策方式和生活方式。每个角度都有两个…

什么是i人,mbti中的i型人格是怎么样的

i人是MBTI总的I型人格&#xff0c;也就是内向型人格&#xff08;Introversion&#xff09;&#xff0c;在MBTI中是其中一个维度。以下是i人的一些常见特征和倾向&#xff1a; 1、内向和独处&#xff1a;I型人格更倾向于独自思考和独处。他们通常从独立的思考和内省中获取精力和…

MBTI性格测试中的 INTP 型人格

摘要&#xff1a;熟悉心理学的朋友&#xff0c;对mbti都不会陌生。而intp&#xff0c;可以说是一种牌玩得好就是天才&#xff0c;玩得不好境遇会十分惨&#xff0c;两极分化很严重的类型。今天我们来讲讲intp型人格都有哪些特征吧。 先来看看intp类型的人一般的倾向性。 MBTI性…

AI风范,院士点赞丨北京人工智能峰会暨AI金雁奖颁奖典礼成功举办,实在智能再获AI金雁奖

4月14日&#xff0c;由中国电子商会人工智能委员会主办&#xff0c;中国创业者俱乐部、北京集智未来人工智能产业创新基地联合主办的“2023北京人工智能峰会暨AI金雁奖颁奖典礼”举行&#xff0c;汇聚了人工智能各领域的产学研专家、院士、人工智能企业代表近300人&#xff0c;…

危!这回,我真的失业了!

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;赞&#xff01;ChatGPT能接入微信了&#xff01; 大家好&#xff0c;…

智能化时代的软件工程:拥抱大模型的正确姿势

智能化时代 Foundation Model Software Engineering 软件工程 以ChatGPT为代表的大模型技术对于包括软件工程在内的很多领域都带来了巨大的冲击&#xff0c;也引发了广泛的焦虑。为了在迷雾中看清一点方向&#xff0c;近期我们基于各种技术文献和实践分享以及我们自身的一些初步…