iOS 微信 8.0.69 页面 onShow/onReady 生命周期不触发,redirectTo/switchTab 后页面空白
问题描述
使用 Taro 3.6.35(React)开发的小程序,在 iOS 微信 8.0.69 版本上,通过 redirectTo 或 switchTab 跳转页面后,目标页面的 onShow、onReady 等生命周期回调不触发,页面呈现空白状态。该问题在 8.0.69 之前的版本(8.0.56、8.0.62、8.0.66)上均无法复现。
复现路径
- 页面 A 调用
wx.redirectTo跳转到页面 B - 页面 B 的
onLoad正常触发,但onShow和onReady不触发 - 页面 B 呈现空白,所有依赖
onShow初始化的逻辑均未执行
wx.switchTab 切换 Tab 页面时也存在同样问题。
测试数据(10 台设备,6 个微信版本,每条链路操作 5 次以上)
机型微信版本复现情况iPhone 12 Pro8.0.69稳定复现iPhone 178.0.69稳定复现iPhone 14 Pro Max8.0.69稳定复现iPhone 13 Pro Max8.0.69稳定复现iPhone 138.0.56未复现iPhone 17 Pro8.0.66未复现iPhone 15 Pro8.0.62未复现小米 148.0.63未复现小米 148.0.69未复现红米8.0.69未复现华为荣耀8.0.56偶现
结论:iOS + 微信 8.0.69 = 100% 稳定复现,Android 不受影响。
问题分析
通过对小程序运行时代码的调试分析,定位到问题发生在页面销毁与创建背靠背执行时的时序竞争:
redirectTo触发旧页面onUnload,内部设置unmounting = true- 新页面
onLoad立即执行,但因unmounting === true,mount()被推入prepareMountList延迟执行 - 旧页面
unmount回调中将unmounting置回false并执行prepareMountList - 但此时
mount()内部的loadResolver()调用与 React 渲染(performUpdate使用setTimeout(0))存在时序竞争 onShow和onReady依赖hasLoaded.then(...)执行,若loadResolver()未在onShow调用前 resolve,生命周期回调将永远挂起
怀疑微信 8.0.69 iOS 版修改了页面生命周期的调度时序(如 onUnload → onLoad → onShow 的回调间隔,或 setTimeout(0) 在 JSCore 中的执行优先级),导致上述竞态窗口从极小概率变为必然命中。
期望的结果
redirectTo / switchTab 后,目标页面的 onShow、onReady 生命周期正常触发。
环境信息
手机型号:iPhone 16 Pro
运行系统:iOS 18.5
微信版本:8.0.69
基础库版本:3.15.0 [1508]
往返耗时:234ms
连接方式:Wi-Fi
