最近有同事反馈,微信邀请有奖分享的二维码在iOS上长按无法识别。排查后组内的同事KK发现移除一段
history.replaceState
代码后恢复正常。
先上这段神奇的代码(非源码):
1 | //给当前 url 增加特殊的参数 |
上面这段代码的背景是产品做了分享的AB Test,需要知道两种用户的分享量。但是目前分享上报的参数已被塞爆(新版协议会解决这个问题),于是我提了个不成熟的小建议(手动扶额),通过在 url 中增加特殊标记来区分。修改location.href会跳转,考虑到移动端的对 h5的兼容性,于是采用了 history.replaceState。
后来再做了测试,通过替换 history.replaceState 的各项入参观察能否识别二维码:
终端类型 | state | title | url.query | url.hash |
---|---|---|---|---|
iOS | √ | √ | × | √ |
android | √ | √ | √ | √ |
总结
在 iOS上替换 url.query
导致二维码识别在网上找了很久没找到原因,android 和 iOS 的表现也不一致,猜测是 iOS 版微信的安全策略吧(但是这种策略是否会影响一些 SPA 应用?)。
分享上报的问题最终通过改变hash
来解决了。