uni-app ios 内存不足,wkwebview崩溃时,reload页面会丢失样式
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 |
操作步骤
- 从uniapp应用,切换到其他占用内存的应用,比如微信,西瓜视频,美团等等比较占内存的应用,触发ios释放掉uniapp 应用的内存。
- 这时候切换回uniapp应用,uniapp的wkwebview 会reload 页面,有些使用 vue 组件的,会丢失样式,或丢失高度等问题。
预期结果
页面能正常显示。
实际结果
页面样式丢失,比如高度,颜色等。
bug描述
问题复现步骤:
- 从uniapp应用,切换到其他占用内存的应用,比如微信,西瓜视频,美团等等比较占内存的应用,触发ios释放掉uniapp 应用的内存。
- 这时候切换回uniapp应用,uniapp的wkwebview 会reload 页面,有些使用 vue 组件的,会丢失样式,或丢失高度等问题。
期望结果:
wkwebview崩溃时,希望能自己控制应用restart,类似plus.runtime.restart()
。目前测试 android应用是restart模式,希望ios也一样,从而避免奇奇怪怪的样式问题。
plus.runtime.isRecovery, plus.webview.isRecovery 这两个标记位,上面内存不足发生时,目前返回都是 undefined。
@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崩溃后页面样式丢失的问题。重要的是,确保在崩溃恢复逻辑中正确处理样式的重新加载和应用,以提供良好的用户体验。