[微信小程序]关于openSetting通过tap的调用 []

- 当前 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


  • 有用 + 1



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

    • 感谢!将所有的promise方式改成callback回调的方式就能正常的调起。


    • 你好,我按照这种方式写了,但是还是提示fail can only be invoked by user TAP gesture.

    • 有代码片断吗?

  • 我是不管怎么样调到授权页面都是空白的 电脑重启也没用

    • 有代码片断吗?

    • 解决了,文档上说了“设置界面只会出现小程序已经向用户请求过的权限”, 谢谢

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


    doAuth('getLocation',{

         success: (res) => {

           console.log(1);

         },

         fail: (res) => {

           console.log(2)

         }

       })


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


    • 报错是因为confirm函数里,我没有去捕获reject,也就是点击确认框的取消触发了reject导致。没有设置拒绝授权的回调,原来我的想法是如果在确认框,用户取消了,那么用户也知道他的做法会有什么影响,所以就没考虑做授权失败的回调;

      根据你的要求,做了下修改,代码片断:

      https://developers.weixin.qq.com/s/yFaZtqmk7e3x

    • 感谢解答

  • 你好,这样写不行?

    • 应该是可以的, 嗯嗯好像
  • 其实这里官方考虑的也欠妥,之前没有限制的时候,逻辑这样最顺:

    用户点击触发wx.chooseAddress

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

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


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

    • 其实像我上面给出的代码片断的做法是,点击的时候,先用getSetting判断是否未授权或者拒绝授权,如果是未授权,则表示可以直接调用chooseAddress去触发授权提示,如果是拒绝授权过,那么就showModal提示,并在用户“确定”后,调用openSetting去授权

      这种思路其实跟你上面说的一样,只不过不是直接使用chooseAddress的回调去判断是否授权或拒绝授权

    • 嗯,所以你这种情况也是不支持对吧

    • 支持的,见这个代码片断:

      wechatide://minicode/wyAMUrmb7X2L



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

    • 开发者工具,然后把调试基础库版本设置成新版本,就可以测试

    • 嗯,谢啦

  • 还是不行啊。。

    • 你是怎么写的?有代码片断吗?