时间点是2018年12月,写了一版小程序其中有两处授权的地方,一处是canvas绘图保存到手机,一处是微信健康获取步数。
因为微信健康需要提交form_id用于消息推送,点击事件是基于一个formtype为submit的button触发的,然后bug就来了,授权相关的代码大概是这个样子的(run_auth_deny会在onshow的时候根据getSetting的状态进行更新):
这里是onshow时检查授权状态
这里是点击后触发的函数
ios毫无问题,但是测试小姐姐的安卓机在拒绝了授权之后死活无法再次呼起授权,也就是代码段最上面的openSetting根本打不开。然后我就开始了各种测试。
先说说官方文档,为了避免无良开发者无脑调用openSetting接口,微信在9月份对openSetting接口的调用进行了调整(顺便吐槽一下官方还说可以在点击后的非手写promise异步回调或者模态框的成功回调内触发,然而这些都是不能兼容所有设备的,至少现在是不行的):
官方的意思是禁止了在类似onshow等生命周期函数里直接呼起openSetting,然后我测试了一下,确实直接wx.openSetting()没法进入设置页,但是在ios端这么写还是能在页面一加载就进入设置页的(测试小姐姐的安卓并不能进入~),嗯。。。那可真蠢。
看了这么多先说说解决方案吧,一些异常的兼容性放在最后再吐槽。目前我掌握的兼容写法是这样的:
wxml要这么写(其实就是放弃了form_id的搜集。。。),利用官方的第二种解决方案(如果想要用wx:if wx:else控制wxml显示/隐藏<button open-type="opensetting">,兼容性会好很多,文章旨在讨论只使用js来解决不同客户端openSetting的兼容性问题~)
js这么写或者像最上面那么写都没有问题,即可以每次点击时都getSetting,也可以在onshow时getSetting记录授权状态,点击时直接进行想要的操作。
这么写每次点都会去getSetting,对性能有些不好的影响,但是利用了微信潜在的getSetting的成功回调在ios端可以无脑调用openSetting这一点会稍微放心一些,毕竟到处都是坑。
顺带吐槽一下授权失败回调的形参e,上周里面的错误码字段还是e.errCode,这周就变成了e.err_code,然后失败的messge还用的驼峰命名e.errMsg。不知道啥时候又会被乱改,真是无力吐槽。
补充说明一下,用每次都getSetting的js,wxml如果还像最上面收集form_id那么写的话
在拒绝授权后,会进入到else if中,我们安卓测试机无法执行else if中的opensetting
最后吐槽一下其他写法,比如说点击以后什么都不管,直接触发获取微信运动的数据,因为之前拒绝过授权,这个授权操作一定会失败,并进入fail回调。
ios端毫无问题,打开了设置页面。我们的安卓测试机在拒绝授权后会走到getWeRunData的失败回调,并且不执行openSetting!!!而且参数e里面只有errMsg这个字段,相比ios少了err_code字段。具体原因不明。。。。。。
大致就是这么多了,估计以后这些问题都会慢慢修复,工作不到1年的新手上路,语文学的也不好,记录一下自己的成长历程~看官多多包涵~
网友评论