收藏
回答

关于openSetting通过tap的调用

框架类型 问题类型 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
回答关注问题邀请回答
收藏

9 个回答

  • 黄思程
    黄思程
    2018-09-14



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

    2018-09-14
    有用 2
    回复 4
    • johon
      johon
      2018-09-15

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


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

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

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

      有代码片断吗?

      2019-02-14
      回复
    • 翊宝宝の老爸
      翊宝宝の老爸
      2020-06-18
      改成这样,手动设置为允许后,还是报:errMsg: "getLocation:fail system permission denied
      2020-06-18
      1
      回复
  • 2018-10-26

    有用 + 1

    2018-10-26
    有用 1
    回复
  • 2020-11-08

    wx.showModal({title:'测试',content:'测试',success(){

            wx.openSetting({success(){console.log('成功',arguments)},fail(){console.log('失败',arguments)}})

       

    }})


    这样还是不行

    2020-11-08
    有用
    回复
  • 2019-02-09

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

    2019-02-09
    有用
    回复 2
    • johon
      johon
      2019-02-14

      有代码片断吗?

      2019-02-14
      回复
    • 2019-02-14

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

      2019-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
    有用
    回复 2
    • johon
      johon
      2018-09-29

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

      2018-09-29
      回复
    • 娘娘
      娘娘
      2020-09-01回复johon
      就是掉不起来,之前是好的,突然就不行了,怎么都掉不起来
      wx.showModal({
          title: ‘123’,
          content: ‘456’,
          success(resd) {
           console.log(resd)
           wx.openSetting({
            success(res) {
             console.log(res)
            },
            complete(com) {
             console.log(com)
            }
           })
          }
         })
      2020-09-01
      回复
登录 后发表内容