收藏
回答

微信 8.0.69 页面 onShow/onReady 生命周期不触发?

iOS 微信 8.0.69 页面 onShow/onReady 生命周期不触发,redirectTo/switchTab 后页面空白


问题描述

使用 Taro 3.6.35(React)开发的小程序,在 iOS 微信 8.0.69 版本上,通过 redirectTo 或 switchTab 跳转页面后,目标页面的 onShowonReady 等生命周期回调不触发,页面呈现空白状态。该问题在 8.0.69 之前的版本(8.0.56、8.0.62、8.0.66)上均无法复现。

复现路径

  1. 页面 A 调用 wx.redirectTo 跳转到页面 B
  2. 页面 B 的 onLoad 正常触发,但 onShow 和 onReady 不触发
  3. 页面 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 不受影响。

问题分析

通过对小程序运行时代码的调试分析,定位到问题发生在页面销毁与创建背靠背执行时的时序竞争:

  1. redirectTo 触发旧页面 onUnload,内部设置 unmounting = true
  2. 新页面 onLoad 立即执行,但因 unmounting === truemount() 被推入 prepareMountList 延迟执行
  3. 旧页面 unmount 回调中将 unmounting 置回 false 并执行 prepareMountList
  4. 但此时 mount() 内部的 loadResolver() 调用与 React 渲染(performUpdate 使用 setTimeout(0))存在时序竞争
  5. onShow 和 onReady 依赖 hasLoaded.then(...) 执行,若 loadResolver() 未在 onShow 调用前 resolve,生命周期回调将永远挂起

怀疑微信 8.0.69 iOS 版修改了页面生命周期的调度时序(如 onUnload → onLoad → onShow 的回调间隔,或 setTimeout(0) 在 JSCore 中的执行优先级),导致上述竞态窗口从极小概率变为必然命中。

期望的结果

redirectTo / switchTab 后,目标页面的 onShowonReady 生命周期正常触发。

环境信息

手机型号:iPhone 16 Pro

运行系统:iOS 18.5

微信版本:8.0.69

基础库版本:3.15.0 [1508]

往返耗时:234ms

连接方式:Wi-Fi


最后一次编辑于  13小时前
回答关注问题邀请回答
收藏
登录 后发表内容