背景:某天我正在愉快的摸鱼,突然同事在群里钉我,说用户在浙政钉app打开公司的应用出现闪退问题。我打开测试机登录账号准备本地复现问题时,发现功能正常。经过同事确认出现故障的手机型号为小米15,并且安卓版本为15。因此我推测问题原因可能是安卓15导致的。
于是我开始在公司寻找安卓15的测试机,结果找了一圈也没找到,正当我准备放弃的时候,其他同事说现在有云平台可以在线使用远程手机进行测试。经过在多个平台进行尝试,终于找到一个能白嫖安卓15测试机的平台(以下是我的使用的平台,大家有需要也可以去网站申请测试机)。
| 平台 | 地址 | 备注 |
|---|---|---|
| 华为 | developer.huawei.com/consumer/cn… | 没有13(优惠机型每天300分钟免费,一次10分钟) |
| 小米 | testit.miui.com/remote | 每天最多30次,并且8小时总时长 |
| 荣耀 | developer.honor.com/cn/doc/guid… | 目前可以免费续时 |
| testin | www.testin.cn/ | 收费 |
| 百度 | yunce.baidu.com/ | 收费 |
| vivo | vcl.vivo.com.cn/#/home/inde… | 注册需要绑定企业,提供营业执照 |
| oppo | open.oppomobile.com/octpcloud/o… | 没有13(手持身份证注册) |
| 腾讯WeTest | wetest.qq.com/product/clo… |
在平台的测试机上安装软件进行测试,发复现出闪退问题,接下来在代码中进行排查发现有这样一段代码
// 首次进入应用时,如果出现历史栈长度大于1,则关闭页面
if (window.history.length > 1) {
zjzwfwAPI.closePage();
}
经过添加日志发现了一个诡异现象,每次进入应用首页时,当前历史栈的长度值不唯一,出现大于1的情况时则会关闭H5应用。
分析发现,我们的应用在浙里办进行单点登陆时进行了多次重定向(推测是该原因导致的),使用重定向方法
window.location.replace,在MDN中的描述中说明使用该方法是不会将当前页面保存到会话历史中的(replace方法以给定的 URL 来替换当前的资源。与 assign 方法 不同的是,调用 replace 方法后,当前页面不会保存到会话历史中(session History),这样,用户点击回退按钮时,将不会再跳转到该页面。)
// 页面打开逻辑大概如下
=> my.html 初始打开页面, 检查是否登陆
=> third-authorize.html
=> a.html(携带认证信息)
=> 通过认证信息请求登陆信息 my.html
进一步推测在安卓端不同安卓版本的webview对于重定向后的历史记录机制存在一定差异,在网上搜索后暂时没有搜索到相关文档说明,目前是通过将之前的问题代码注释调解决该问题的,有了解的大佬能帮忙解答下,为什么会出现该问题吗,感谢🙏。