- 当前 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
改成这样即可,看代码你用了promise,promise是异步的,“点击行为允许调用”这个机制要求是同步的
感谢!将所有的promise方式改成callback回调的方式就能正常的调起。
你好,我按照这种方式写了,但是还是提示fail can only be invoked by user TAP gesture.
有代码片断吗?
有用 + 1
wx.showModal({title:'测试',content:'测试',success(){
wx.openSetting({success(){console.log('成功',arguments)},fail(){console.log('失败',arguments)}})
}})
这样还是不行
我是不管怎么样调到授权页面都是空白的 电脑重启也没用
有代码片断吗?
解决了,文档上说了“设置界面只会出现小程序已经向用户请求过的权限。”, 谢谢
用你封装的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
怎么测试的呢?那开发者工具就可以测试授权的改动吗?
开发者工具,然后把调试基础库版本设置成新版本,就可以测试
嗯,谢啦
还是不行啊。。
你是怎么写的?有代码片断吗?
wx.showModal({
title: ‘123’,
content: ‘456’,
success(resd) {
console.log(resd)
wx.openSetting({
success(res) {
console.log(res)
},
complete(com) {
console.log(com)
}
})
}
})