关于openSetting通过tap的调用
发布于 6 年前 作者 yan94 4031 次浏览 来自 问答
  • 当前 Bug 的表现(可附上截图)

官方说明了openSetting的调用是支持通过tap去触发showModal,再在showModal中调起的,但实际操作后,与说明的有出入。

由于实际开发中,为了方便授权,会将getSetting,showModal,openSetting封装于一个函数,方便检测权限并授权,但也应该是满足了以上说的在tap中触发的要求,但测试后,却还是显示如下提示

VM255:1 openSetting:fail can only be invoked by user TAP gesture.
  • 预期表现

支持通过tap去触发showModal,再在showModal中调起openSetting

  • 复现路径

导入代码片段(需填写appid,因为需要用到授权),如下操作:

1、点击授权,此时点击“取消”拒绝授权

2、再次点击授权,此时由于判断用户已经拒绝过授权,所以会去调用showModal显示确认授权框,此时点击”确定“,回去调用openSetting。这个时候见控制台,就会有如下提示

openSetting:fail can only be invoked by user TAP gesture.

  • 提供一个最简复现 Demo

代码片段:wechatide://minicode/PrIPLomJ7222

- 结论及解决方案

经官方开发解答,由于封装的过程中使用了promise的方式去处理回调才导致的问题,改成直接普通的回调方式即可解决问题;

因此也就是原来的判断方式和流程不变,只需要修改一下回调方式即可。

解决后的代码片段:wechatide://minicode/wyAMUrmb7X2L

8 回复

怎么测试的呢?那开发者工具就可以测试授权的改动吗?

其实这里官方考虑的也欠妥,之前没有限制的时候,逻辑这样最顺:

用户点击触发wx.chooseAddress

wx.chooseAddress 在失败后判断是什么原因,如果是access deny,则通过wx.showModal提示用户:需打开设置页并重新设置授权

但是这是在第一次点击触发wx.chooseAddress的回调里面showModal了,所以是打不开openSetting的

所以能不能再加一个判断:如果是bintap触发的wx.chooseAddress,其回调的wx.showModal也可以打开openSetting?

改成这样即可,看代码你用了promise,promise是异步的,“点击行为允许调用”这个机制要求是同步的

你好,这样写不行?

我是不管怎么样调到授权页面都是空白的

电脑重启也没用

用你封装的doAuth.js , 调用授权时 , 怎么弄回调呢

doAuth(‘getLocation’,{

     success: (res) => {

       console.log(1);

     },

     fail: (res) => {

       console.log(2)

     }

   })

这样在已经授权的就能正常触发回调 , 还没授权的无法触发回调 , 报错Uncaught (in promise) 

还是不行啊。。

回到顶部