Ionic iOS应用后台驻留3小时后唤醒仅显示启动页无法继续
老哥,这个问题我太熟了!之前帮好几个Ionic开发者踩过iOS 11.x上的这个坑——后台挂个几小时再唤醒,就卡在启动页,Safari调试还报ReferenceError: Can not find variable: cordova,本质就是iOS的后台内存回收机制搞的鬼:系统把闲置应用的WebView内存清了,再次唤醒时WebView重启,但Cordova的初始化没跟上,导致核心变量丢失。结合你的环境(iOS 11.3.1、Cordova iOS 4.4.0、Ionic 3.9.2),给你几个靠谱的解决思路:
1. 优先升级Cordova iOS平台版本
你用的Cordova iOS 4.4.0是2018年的老版本了,后续版本专门针对iOS 11+的内存回收问题做了修复。直接升级平台试试:
# 先移除旧版本 cordova platform remove ios # 添加兼容iOS 11的稳定版本,5.1.1亲测有效,也可以尝试更高的稳定版 cordova platform add ios@5.1.1
升级后记得重新编译打包,大部分情况下,升级平台就能直接解决这类系统适配问题。
2. 替换成WKWebView(推荐)
老旧的UIWebView在iOS上内存管理拉胯,换成Ionic官方的WKWebView插件,不仅性能更好,还能大幅减少内存回收导致的重启问题:
# 安装适配Ionic 3的WebView插件版本 cordova plugin add cordova-plugin-ionic-webview@2.5.3
然后在config.xml里添加配置,强制启用WKWebView:
<preference name="WKWebViewOnly" value="true" />
这个操作能从底层改善WebView的运行机制,比临时 workaround 靠谱多了。
3. 临时补救:监听唤醒事件,手动重启
如果暂时不想升级平台或换WebView,可以加个监听逻辑,当应用从后台回到前台时,检查cordova是否存在,不存在就重新加载页面:
在app.component.ts里添加这段代码:
import { Platform } from 'ionic-angular'; constructor(private platform: Platform) { this.platform.ready().then(() => { // 监听应用从后台唤醒的事件 document.addEventListener('resume', () => { // 检查cordova核心变量是否存在 if (typeof cordova === 'undefined') { // 重新加载页面,让Cordova重新初始化 window.location.reload(); } }); }); }
这是个临时救急方案,虽然会让应用重新加载,但至少用户不会卡在启动页进不去。
4. 优化应用内存,减少被回收概率
iOS会优先回收内存占用高的后台应用,所以从代码层面优化内存也很重要:
- 及时销毁无用的RxJS订阅、定时器,避免内存泄漏
- 图片用懒加载,不要一次性加载大量高清图
- 复杂页面按需渲染,减少DOM节点数量
额外提一句:你的Node v6.11.5也挺老的,虽然不是直接原因,但升级到Node 8.x或10.x的稳定版,配合最新的Ionic app-scripts,也能减少一些编译层面的兼容问题。
内容的提问来源于stack exchange,提问作者Alex

