首页 > 解决方案 > Cordova WKWebView 仅在 iPhone 11 Pro 上出现白屏

问题描述

问题

我们的客户报告在 iOS 设备上启动应用程序时出现随机白屏。虽然几乎所有设备都碰巧在重试后成功启动了应用程序,但 iPhone 11 Pro 总是以白屏启动。这让我(经过长时间的黑匣子挖掘)假设快速 iPhone 存在问题并且 WKWebView 可能以竞争条件开始。

在我的 iPhone 11 Pro 模拟器上,我很幸运有 50/50 的机会出现白屏,所以我开始调试CDVWKWebKitViewEngine.m。我对Objective-C一无所知,所以我只是一遍又一遍地重新启动以随机发现调用堆栈中的差异。在这样做的过程中,我慢慢地了解了插件如何在幕后工作。userContentController:didReceiveScriptMessage似乎在容器的成功启动以及正在加载的所有脚本和资产中发挥了作用。

很长一段时间后,我意识到在第 321 行破坏代码CDVWKWebKitViewEngine.m使应用程序在模拟器中不断运行,这使我在第 321 行添加了一个睡眠计时器:

- (id)forwardingTargetForSelector:(SEL)aSelector
{
    [NSThread sleepForTimeInterval:1.0];
    return _engineWebView;
}

这至少让应用程序在模拟器中没有断点的情况下启动。但是在物理设备上它保持白屏。

我现在将继续调试以发现另一点。但任何帮助或提示都非常感谢。

预计会发生什么?

应用程序应在启动画面后正确启动。CDVWKWebKitViewEngine.m->userContentController:didReceiveScriptMessage应该在每个 App 可靠启动时触发。

实际发生了什么?

userContentController:didReceiveScriptMessage仅在 iPhone 11 Pro Simulator、iOS 13.3 上被触发时[NSThread sleepForTimeInterval:1.0];添加到第 321 行CDVWKWebKitViewEngine.m

- (id)forwardingTargetForSelector:(SEL)aSelector
{
    [NSThread sleepForTimeInterval:1.0];
    return _engineWebView;
}

在不添加睡眠线的情况下,我在模拟器中的 10 个案例中有 5 个遇到白屏。userContentController:didReceiveScriptMessage在这些情况下不会被解雇。

在物理 iPhone 11 Pro、iOS 13.3.1 上,该应用程序在启动后不断启动并出现白屏并且 userContentController:didReceiveScriptMessage不会被触发 - 即使我将睡眠设置为 5 秒。

信息

环境、平台、设备

版本信息

科尔多瓦:

反应:-onsenui:2.10.8-反应:16.8.6

XCode:11.3.1 MacOS Catalina 10.15.4

标签: iosobjective-ccordovacordova-pluginswkwebview

解决方案


推荐阅读