收藏
回答

关于openSetting通过tap的调用

问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
API和组件 小程序 Bug openSetting 工具 6.7.2 2.3.0

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


最后一次编辑于  2018-09-15
回答关注问题邀请回答
收藏

8 个回答

  • 微信技术专员 - Rex
    微信技术专员 - Rex
    2018-09-14



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

    2018-09-14
    赞同 1
    回复 3
    • johon
      johon
      2018-09-15

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


      2018-09-15
      回复
    • 嗯
      01-04

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

      01-04
      回复
    • johon
      johon
      02-14回复

      有代码片断吗?

      02-14
      回复
  • FroyoNaux
    FroyoNaux
    2018-10-26

    有用 + 1

    2018-10-26
    赞同 1
    回复
  • wall
    wall
    02-09

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

    02-09
    赞同
    回复 2
    • johon
      johon
      02-14

      有代码片断吗?

      02-14
      回复
    • wall
      wall
      02-14

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

      02-14
      回复
  • 李叔叔
    李叔叔
    2018-10-23

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


    doAuth('getLocation',{

         success: (res) => {

           console.log(1);

         },

         fail: (res) => {

           console.log(2)

         }

       })


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


    2018-10-23
    赞同
    回复 2
    • johon
      johon
      2018-10-25

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

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

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

      2018-10-25
      回复
    • 李叔叔
      李叔叔
      2018-10-25回复johon

      感谢解答

      2018-10-25
      回复
  • 还好
    还好
    2018-10-19

    你好,这样写不行?

    2018-10-19
    赞同
    回复 1
    • johon
      johon
      2018-10-20

      应该是可以的

      2018-10-20
      回复
  • 小程序@小萝卜报名
    小程序@小萝卜报名
    2018-10-12

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

    用户点击触发wx.chooseAddress

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

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


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

    2018-10-12
    赞同
    回复 3
    • johon
      johon
      2018-10-12

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

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

      2018-10-12
      回复
    • 小程序@小萝卜报名
      小程序@小萝卜报名
      2018-10-12

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

      2018-10-12
      回复
    • johon
      johon
      2018-10-20回复小程序@小萝卜报名

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

      wechatide://minicode/wyAMUrmb7X2L



      2018-10-20
      回复
  • 王迪
    王迪
    2018-10-08

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

    2018-10-08
    赞同
    回复 2
    • johon
      johon
      2018-10-08

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

      2018-10-08
      回复
    • 王迪
      王迪
      2018-10-08

      嗯,谢啦

      2018-10-08
      回复
  • 楊宗纬
    楊宗纬
    2018-09-29

    还是不行啊。。

    2018-09-29
    赞同
    回复 1
    • johon
      johon
      2018-09-29

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

      2018-09-29
      回复