uni-app ios 内存不足,wkwebview崩溃时,reload页面会丢失样式

发布于 1周前 作者 zlyuanteng 来自 Uni-App

uni-app ios 内存不足,wkwebview崩溃时,reload页面会丢失样式

开发环境与配置

详情
产品分类 uniapp/App
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 14.6.1
HBuilderX类型 正式
HBuilderX版本号 4.36
手机系统 iOS
手机系统版本号 iOS 18
手机厂商 苹果
手机机型 iPhone 13
页面类型 vue
vue版本 vue3
打包方式 离线
项目创建方式 HBuilderX

操作步骤

  1. 从uniapp应用,切换到其他占用内存的应用,比如微信,西瓜视频,美团等等比较占内存的应用,触发ios释放掉uniapp 应用的内存。
  2. 这时候切换回uniapp应用,uniapp的wkwebview 会reload 页面,有些使用 vue 组件的,会丢失样式,或丢失高度等问题。

预期结果

页面能正常显示。

实际结果

页面样式丢失,比如高度,颜色等。

bug描述

问题复现步骤:

  1. 从uniapp应用,切换到其他占用内存的应用,比如微信,西瓜视频,美团等等比较占内存的应用,触发ios释放掉uniapp 应用的内存。
  2. 这时候切换回uniapp应用,uniapp的wkwebview 会reload 页面,有些使用 vue 组件的,会丢失样式,或丢失高度等问题。

期望结果:

wkwebview崩溃时,希望能自己控制应用restart,类似plus.runtime.restart()。目前测试 android应用是restart模式,希望ios也一样,从而避免奇奇怪怪的样式问题。

plus.runtime.isRecovery, plus.webview.isRecovery 这两个标记位,上面内存不足发生时,目前返回都是 undefined。


3 回复

@DCloud_heavensoft 麻烦官方大佬看下这个问题,是否能提供个解决方案,谢谢


自行解决,忽略。

在处理uni-app在iOS设备上因内存不足导致WKWebView崩溃,并在重新加载(reload)页面时丢失样式的问题时,可以采取一些技术手段来确保样式能够被正确加载和恢复。这里提供一些可能的解决方案,主要通过代码示例来展示如何处理这种情况。

1. 监听WKWebView崩溃并恢复

首先,我们需要监听WKWebView的崩溃事件。虽然uni-app本身不直接暴露WKWebView的崩溃监听接口,但你可以通过原生插件或者H5+ API来实现。假设你已经有了访问原生代码的能力,以下是一个iOS原生代码片段,用于监听WKWebView的崩溃并尝试恢复:

// 在AppDelegate.m中
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {
    if ([error.domain isEqualToString:WKErrorDomain] && error.code == WKErrorWebContentProcessTerminated) {
        // WKWebView崩溃处理
        dispatch_async(dispatch_get_main_queue(), ^{
            [webView reload];
            // 可以考虑在这里添加额外的样式恢复逻辑,比如重新注入CSS
            NSString *cssString = @"body { background-color: white; } /* 示例样式 */";
            NSString *jsString = [NSString stringWithFormat:@"var style = document.createElement('style'); style.innerHTML = '%@'; document.head.appendChild(style);", cssString];
            [webView evaluateJavaScript:jsString completionHandler:nil];
        });
    }
}

2. 使用LocalStorage或SessionStorage保存样式信息

为了避免样式丢失,你可以在页面加载时将样式信息保存到LocalStorage或SessionStorage中,然后在页面重新加载时从存储中恢复这些样式。以下是一个JavaScript示例:

// 保存样式到LocalStorage
window.onload = function() {
    var styles = document.styleSheets[0].cssRules; // 获取第一个样式表的规则
    var styleString = Array.from(styles).map(rule => rule.cssText).join(';');
    localStorage.setItem('savedStyles', styleString);
};

// 页面重新加载时恢复样式
window.onload = function() {
    var savedStyles = localStorage.getItem('savedStyles');
    if (savedStyles) {
        var styleElement = document.createElement('style');
        styleElement.textContent = savedStyles;
        document.head.appendChild(styleElement);
    }
};

注意:上述JavaScript代码仅为示例,实际应用中可能需要处理多个样式表、样式冲突等问题。

结论

通过上述方法,你可以在uni-app的iOS应用中更好地处理WKWebView崩溃后页面样式丢失的问题。重要的是,确保在崩溃恢复逻辑中正确处理样式的重新加载和应用,以提供良好的用户体验。

回到顶部