H5应用闪退问题排查记录

577 阅读2分钟

背景:某天我正在愉快的摸鱼,突然同事在群里钉我,说用户在浙政钉app打开公司的应用出现闪退问题。我打开测试机登录账号准备本地复现问题时,发现功能正常。经过同事确认出现故障的手机型号为小米15,并且安卓版本为15。因此我推测问题原因可能是安卓15导致的。

00e93901213fb80e33fb815a7b8e3b21b8389487.jpeg

于是我开始在公司寻找安卓15的测试机,结果找了一圈也没找到,正当我准备放弃的时候,其他同事说现在有云平台可以在线使用远程手机进行测试。经过在多个平台进行尝试,终于找到一个能白嫖安卓15测试机的平台(以下是我的使用的平台,大家有需要也可以去网站申请测试机)。

image.png

平台地址备注
华为developer.huawei.com/consumer/cn…没有13(优惠机型每天300分钟免费,一次10分钟)
小米testit.miui.com/remote每天最多30次,并且8小时总时长
荣耀developer.honor.com/cn/doc/guid…目前可以免费续时
testinwww.testin.cn/收费
百度yunce.baidu.com/收费
vivovcl.vivo.com.cn/#/home/inde…注册需要绑定企业,提供营业执照
oppoopen.oppomobile.com/octpcloud/o…没有13(手持身份证注册)
腾讯WeTestwetest.qq.com/product/clo…

在平台的测试机上安装软件进行测试,发复现出闪退问题,接下来在代码中进行排查发现有这样一段代码

// 首次进入应用时,如果出现历史栈长度大于1,则关闭页面
if (window.history.length > 1) {
    zjzwfwAPI.closePage();
}

经过添加日志发现了一个诡异现象,每次进入应用首页时,当前历史栈的长度值不唯一,出现大于1的情况时则会关闭H5应用。

image.png

image.png

分析发现,我们的应用在浙里办进行单点登陆时进行了多次重定向(推测是该原因导致的),使用重定向方法 window.location.replace在MDN中的描述中说明使用该方法是不会将当前页面保存到会话历史中的(replace方法以给定的 URL 来替换当前的资源。与 assign 方法 不同的是,调用 replace 方法后,当前页面不会保存到会话历史中(session History),这样,用户点击回退按钮时,将不会再跳转到该页面。)

// 页面打开逻辑大概如下
=> my.html 初始打开页面, 检查是否登陆
=> third-authorize.html 
=> a.html(携带认证信息) 
=> 通过认证信息请求登陆信息 my.html

进一步推测在安卓端不同安卓版本的webview对于重定向后的历史记录机制存在一定差异,在网上搜索后暂时没有搜索到相关文档说明,目前是通过将之前的问题代码注释调解决该问题的,有了解的大佬能帮忙解答下,为什么会出现该问题吗,感谢🙏。