"White Screen of Death" in Cordova iOS

Many of my iOS users have been reporting the dreaded “white screen of death” when opening my iOS Cordova Meteor app. It seems to have gotten worse this year, but I’m not sure. I have been noticing it myself more, though. I’ve been keeping current with Meteor updates and am currently on 2.5.1, but this was happening before that (including before the Cordova 10 upgrade, I’m pretty sure).

It seems to happen in either of these situations:

  • Hot code push. I open the app, it loads fine, tells me there’s an update available (my custom UI for reloads), so I tap to update. Splash screen appears, then quickly fades to white.
  • App backgrounded for too long / too many other apps loaded, even with no pending update. When I come back to the app, it’s a white screen and unresponsive.

Generally, quitting the app and starting it again brings it back to life. However, I did have an issue with my production app, downloaded from the App Store, where it would not load even after restarting the app and my phone. Maybe it had something to do with the app having replaced an existing TestFlight version? I’ve received a couple other reports of people not being able to bring it back to life by restarting the app or their device, though, so it’s not just me.

I was able to get it to white-screen while I had XCode connected overnight with the app closed. Here’s what I get in the XCode log output:

Output from XCode for white-screen-of-death

I got this output shortly after I went to bed (timestamps and PID info shortened for clarity):

21:16:18.852056 {Thread A} CDVWebViewEngine shouldReloadWebView::
21:16:18.852115 {Thread A} CDVWebViewEngine shouldReloadWebView title: Strum Machine
21:16:18.852132 {Thread A} CDVWebViewEngine shouldReloadWebView location: http://localhost:12000/app
21:16:18.852147 {Thread A} CDVWebViewEngine shouldReloadWebView reload: 0
[INFO] Socket error: Bad file descriptor on socket 3
[INFO] GCDWebServer stopped
[INFO] GCDWebServer started on port 12000 and reachable at http://localhost:12000/
21:16:18.888569 {Thread A} Connection timeout. No sockjs heartbeat received.

And then this output when I tried opening the app again in the morning:

06:41:41.522506 {Thread A} [Process] 0x105bcc900 - [PID=81584] WebProcessProxy::didClose: (web process 0 crash)
06:41:41.522745 {Thread A} [Process] 0x105bcc900 - [PID=81584] WebProcessProxy::processDidTerminateOrFailedToLaunch: reason=4
06:41:41.522894 {Thread A} [ProcessSuspension] 0x105bf83c0 - ProcessAssertion: Failed to acquire RBS Background assertion 'ConnectionTerminationWatchdog' for process because PID is invalid
06:41:41.523457 {Thread A} [Process] 0x104024e18 - [pageProxyID=11, webPageID=12, PID=81584] WebPageProxy::processDidTerminate: (pid 81584), reason 4
06:41:41.524813 {Thread B} [ProcessSuspension] 0x105bf83c0 - ProcessAssertion: Failed to acquire RBS assertion 'ConnectionTerminationWatchdog' for process with PID=0, error: (null)
06:41:41.534247 {Thread A} [Loading] 0x104024e18 - [pageProxyID=11, webPageID=12, PID=81584] WebPageProxy::dispatchProcessDidTerminate: reason=4
06:41:41.541066 {Thread C} [assertion] Error acquiring assertion: <Error Domain=RBSAssertionErrorDomain Code=2 "Specified target process does not exist" UserInfo={NSLocalizedFailureReason=Specified target process does not exist}>
06:41:41.541135 {Thread C} [ProcessSuspension] 0x105bf8420 - ProcessAssertion: Failed to acquire RBS assertion 'NetworkProcess Background Assertion' for process with PID=81586, error: Error Domain=RBSAssertionErrorDomain Code=2 "Specified target process does not exist" UserInfo={NSLocalizedFailureReason=Specified target process does not exist}
06:41:41.547863 {Thread A} [Process] 0x105b64320 - NetworkProcessProxy::didClose (Network Process 0 crash)
06:41:41.549848 {Thread A} CDVWebViewEngine shouldReloadWebView::
06:41:41.549885 {Thread A} CDVWebViewEngine shouldReloadWebView title:
06:41:41.549970 {Thread A} CDVWebViewEngine shouldReloadWebView location: http://localhost:12000/app
06:41:41.550035 {Thread A} CDVWebViewEngine shouldReloadWebView reload: 0
[INFO] Socket error: Bad file descriptor on socket 3
[INFO] GCDWebServer stopped
[INFO] GCDWebServer started on port 12000 and reachable at http://localhost:12000/
06:41:41.693031 {Thread A} IAB.close() called but it was already closed.
onReset called
error in connection_block_invoke_2: Connection interrupted
06:41:41.853148 {Thread A} The preference key "AutoHideSplashScreen" is not defined and will default to "TRUE"
06:42:11.527380 {Thread A} Could not signal service com.apple.WebKit.WebContent: 113: Could not find specified service

I also captured all the logs in Console.app that matched my app name, which I will paste in below (collapsed) in case anybody wants to see them:

Console.app logs when bringing white-screen-of-death app to foreground
error	06:41:41.545813-0800	Strum Machine	0x105bcc900 - [PID=81584] WebProcessProxy::didClose: (web process 0 crash)
error	06:41:41.546047-0800	Strum Machine	0x105bcc900 - [PID=81584] WebProcessProxy::processDidTerminateOrFailedToLaunch: reason=4
default	06:41:41.546637-0800	Strum Machine	0x105bcc900 - [PID=81584] WebProcessProxy::shutDown:
error	06:41:41.546802-0800	Strum Machine	0x105bf83c0 - ProcessAssertion: Failed to acquire RBS Background assertion 'ConnectionTerminationWatchdog' for process because PID is invalid
default	06:41:41.546894-0800	Strum Machine	0x105bcc900 - [PID=81584] WebProcessProxy::processWillShutDown:
error	06:41:41.549561-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=81584] WebPageProxy::processDidTerminate: (pid 81584), reason 4
error	06:41:41.549619-0800	Strum Machine	0x105bf83c0 - ProcessAssertion: Failed to acquire RBS assertion 'ConnectionTerminationWatchdog' for process with PID=0, error: (null)
default	06:41:41.549727-0800	Strum Machine	0x281320a20 - WKRBSAssertionDelegate: assertion was invalidated, error: <WKRBSAssertionDelegate: 0x281d589c0>
default	06:41:41.549792-0800	Strum Machine	0x28132cc90 - WKRBSAssertionDelegate: assertion was invalidated, error: <WKRBSAssertionDelegate: 0x281d5cb20>
default	06:41:41.549849-0800	Strum Machine	Removing visibility propagation view 0x10312cab0
default	06:41:41.549913-0800	Strum Machine	0x103840200 -[WKWebView _processDidExit]
default	06:41:41.550441-0800	Strum Machine	0x103840200 (pageProxyID=11) -[WKWebView _cancelAnimatedResize] _dynamicViewportUpdateMode 0
default	06:41:41.550584-0800	Strum Machine	0x105bcc900 - [PID=81584] WebProcessProxy::processTerminated:
default	06:41:41.550640-0800	Strum Machine	Service did finish database update with protection type 1 and provider 1
error	06:41:41.550695-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=81584] WebPageProxy::dispatchProcessDidTerminate: reason=4
default	06:41:41.550750-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=81584] WebPageProxy::reload:
default	06:41:41.551064-0800	Strum Machine	0x105b643f8 - [PID=81586] ProcessThrottler::updateAssertionIfNeeded: sending ProcessDidResume IPC because the process was suspended
default	06:41:41.551460-0800	Strum Machine	0x105b643f8 - [PID=81586] ProcessThrottler::setAssertionType: Updating process assertion type to 1 (foregroundActivities=0, backgroundActivities=1)
default	06:41:41.551944-0800	Strum Machine	0x2813a0f30 - WKProcessAssertionBackgroundTaskManager: beginBackgroundTaskWithName
default	06:41:41.552109-0800	Strum Machine	WKProcessAssertionBackgroundTaskManager: Took a FinishTaskInterruptable assertion for own process
default	06:41:41.552208-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=81584] WebPageProxy::launchProcessForReload:
default	06:41:41.552369-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=81584] WebPageProxy::launchProcess:
default	06:41:41.552457-0800	Strum Machine	0x105bcc900 - [PID=81584] WebProcessProxy::removeWebPage: webPage=0x104024e18, pageProxyID=11, webPageID=12
default	06:41:41.552597-0800	Strum Machine	0x10d14c000 - [PID=0] WebProcessProxy::constructor:
default	06:41:41.552649-0800	Strum Machine	0x105be4440 - [PID=0, throttler=0x10d14c170] ProcessThrottler::Activity::Activity: Starting background activity / 'WebProcess initialization'
debug	06:41:41.552705-0800	Strum Machine	looked up value 1 for key RemoteInspectorEnabled in CFPrefsPlistSource<0x2833df380> (Domain: com.apple.webinspectord, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No) via CFPrefsSearchListSource<0x2833dcc80> (Domain: com.apple.webinspectord, Container: (null))
default	06:41:41.553092-0800	Strum Machine	+[AVPictureInPicturePlatformAdapter isPictureInPictureSupported] isPictureInPictureSupported YES
default	06:41:41.553148-0800	Strum Machine	Service did finish database update with protection type 1 and provider 1
debug	06:41:41.553323-0800	Strum Machine	Invalidating cache
error	06:41:41.554150-0800	Strum Machine	Error acquiring assertion: <Error Domain=RBSAssertionErrorDomain Code=2 "Specified target process does not exist" UserInfo={NSLocalizedFailureReason=Specified target process does not exist}>
error	06:41:41.554207-0800	Strum Machine	0x105bf8420 - ProcessAssertion: Failed to acquire RBS assertion 'NetworkProcess Background Assertion' for process with PID=81586, error: Error Domain=RBSAssertionErrorDomain Code=2 "Specified target process does not exist" UserInfo={NSLocalizedFailureReason=Specified target process does not exist}
default	06:41:41.554887-0800	Strum Machine	0x10d14c000 - [PID=0] WebProcessProxy::addExistingWebPage: webPage=0x104024e18, pageProxyID=11, webPageID=12
default	06:41:41.570532-0800	Strum Machine	0x103840200 -[WKWebView _didRelaunchProcess]
default	06:41:41.570612-0800	Strum Machine	0x105bf9080 - NavigationState is taking a process network assertion because a page load started
default	06:41:41.571146-0800	Strum Machine	0x105be4680 - [PID=0, throttler=0x10d14c170] ProcessThrottler::Activity::Activity: Starting background activity / 'Page Load'
default	06:41:41.571584-0800	Strum Machine	0x105bcc900 - [PID=81584] WebProcessProxy::destructor:
default	06:41:41.571639-0800	Strum Machine	0x105bcca70 - [PID=81584] ProcessThrottler::invalidateAllActivities: BEGIN (foregroundActivityCount: 0, backgroundActivityCount: 0)
default	06:41:41.571721-0800	Strum Machine	0x105bcca70 - [PID=81584] ProcessThrottler::invalidateAllActivities: END
default	06:41:41.571886-0800	Strum Machine	0x105bf8300 - ~ProcessAssertion: Releasing process assertion 'WebProcess Suspended Assertion' for process with PID=81584
error	06:41:41.572495-0800	Strum Machine	0x105b64320 - NetworkProcessProxy::didClose (Network Process 0 crash)
default	06:41:41.572592-0800	Strum Machine	0x105b643f8 - [PID=81586] ProcessThrottler::invalidateAllActivities: BEGIN (foregroundActivityCount: 0, backgroundActivityCount: 1)
default	06:41:41.572714-0800	Strum Machine	0x105b643f8 - [PID=81586] ProcessThrottler::sendPrepareToSuspendIPC: isSuspensionImminent=0
default	06:41:41.572807-0800	Strum Machine	0x105b643f8 - [PID=81586] ProcessThrottler::sendPrepareToSuspendIPC: Sending PrepareToSuspend(5, isSuspensionImminent=0) IPC
default	06:41:41.572999-0800	Strum Machine	0x105b643f8 - [PID=81586] ProcessThrottler::invalidateAllActivities: END
default	06:41:41.573050-0800	Strum Machine	0x105bf83c0 - ProcessAssertion::processAssertionWasInvalidated() PID=0
default	06:41:41.573101-0800	Strum Machine	0x105bf8360 - ProcessAssertion: RBS Suspended assertion for process with PID=81586 was invalidated
default	06:41:41.573180-0800	Strum Machine	0x105bf8360 - ProcessAssertion::processAssertionWasInvalidated() PID=81586
default	06:41:41.573255-0800	Strum Machine	0x105bf8420 - ProcessAssertion::processAssertionWasInvalidated() PID=81586
default	06:41:41.573345-0800	Strum Machine	0x105bf8360 - ~ProcessAssertion: Releasing process assertion 'NetworkProcess Suspended Assertion' for process with PID=81586
default	06:41:41.573482-0800	Strum Machine	0x105bf8420 - ~ProcessAssertion: Releasing process assertion 'NetworkProcess Background Assertion' for process with PID=81586
default	06:41:41.573617-0800	Strum Machine	0x105bb4888 - ApplicationStateTracker: UISceneWillEnterForeground
default	06:41:41.573709-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=0] WebPageProxy::applicationWillEnterForeground: isSuspendedUnderLock? 0
default	06:41:41.573847-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=0] WebPageProxy::updateActivityState: view visibility state changed 0 -> 1
default	06:41:41.573901-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=0] WebPageProxy::updateThrottleState: UIProcess is taking a foreground assertion because the view is visible
default	06:41:41.573956-0800	Strum Machine	0x105be4710 - [PID=0, throttler=0x10d14c170] ProcessThrottler::Activity::Activity: Starting foreground activity / 'View is visible'
default	06:41:41.574074-0800	Strum Machine	sceneOfRecord: sceneID: sceneID:com.strummachine.mobileapp-default  persistentID: CB336D6E-04B1-492F-9085-5DE154C708FC
default	06:41:41.574162-0800	Strum Machine	Deactivation reason added: 5; deactivation reasons: 6144 -> 6176; animating application lifecycle event: 1
default	06:41:41.574218-0800	Strum Machine	Ignoring already applied deactivation reason: 12; deactivation reasons: 6176
debug	06:41:41.574465-0800	Strum Machine	looked up value {
    Proactive =     {
        changeType = 0;
        changeTypeDescription = Immediate;
        date = "2021-12-15 03:01:34 +0000";
        event = 5;
        eventdescription = Playback;
        eventreason = "Playback changed for origin-Big Red-1280262988/client-com.spotify.client-61550 (Spotify)/player-MediaRemote-DefaultPlayer";
        selectionreason = UserSelected;
        timesince = "41982.9442589283";
        type = 1;
    };
    UserSelected =     {
        changeType = 0;
        changeTypeDescription = Immediate;
        date = "2021-12-15 03:01:34 +0000";
        event = 5;
        eventdescription = Playback;
        eventreason = "Playback changed for origin-Big Red-1280262988/client-com.spotify.client-61550 (Spotify)/player-MediaRemote-DefaultPlayer";
        selectionreason = "was not playing recently <33539.415038> ago and was not <UserSelected> recently <41982.940411> seconds ago";
        timesince = "41982.94744503498";
        type = 0;
    };
} for key SystemEndpoint in CFPrefsPlistSource<0x2833c2000> (Domain: com.apple.mediaremote, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No)
default	06:41:41.574575-0800	Strum Machine	CDVWebViewEngine shouldReloadWebView::
default	06:41:41.574650-0800	Strum Machine	CDVWebViewEngine shouldReloadWebView title:
default	06:41:41.574987-0800	Strum Machine	CDVWebViewEngine shouldReloadWebView location: http://localhost:12000/app
default	06:41:41.575356-0800	Strum Machine	CDVWebViewEngine shouldReloadWebView reload: 0
debug	06:41:41.575412-0800	Strum Machine	looked up value Tue Dec 14 21:22:17 2021 for key LastPlayingDate in CFPrefsPlistSource<0x2833c2000> (Domain: com.apple.mediaremote, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No)
debug	06:41:41.577250-0800	Strum Machine	[0x10312cf80] scheduled
debug	06:41:41.577752-0800	Strum Machine	nw_path_evaluator_start Adding client to default path evaluator
default	06:41:41.577966-0800	Strum Machine	nw_path_evaluator_start [4A39B207-FE18-43B6-8E8E-F778869ED778 <NULL> generic, attribution: developer]
	path: satisfied (Path is satisfied), interface: en0, ipv4, dns
debug	06:41:41.578330-0800	Strum Machine	[0x10312cf80] __SCNetworkReachabilityGetFlagsFromPath(GetFlags), flags = 0x00000002, nw_path_status_satisfied
debug	06:41:41.578465-0800	Strum Machine	[0x10312cf80] __SCNetworkReachabilityGetFlagsFromPath(GetFlags), flags = 0x00000002, nw_path_status_satisfied
default	06:41:41.578540-0800	Strum Machine	Deactivation reason removed: 11; deactivation reasons: 6176 -> 4128; animating application lifecycle event: 1
default	06:41:41.579015-0800	Strum Machine	[0x2836d9ea0] [keyboardFocus] Recreation of event deferring records requested: removing recreation reason: detachedContext; for reason: _UIEventDeferringManager: 0x2836d9ea0: recreating keyboardFocus: context attached for window: 0x10320f9e0; contextID: 0x6269C998
default	06:41:41.646711-0800	Strum Machine	0x105be4770 - [PID=0, throttler=0x10d14c170] ProcessThrottler::Activity::Activity: Starting foreground activity / 'WebPageProxy::runJavaScriptInFrameInScriptWorld'
default	06:41:41.646910-0800	Strum Machine	0x2813a0f30 - WKProcessAssertionBackgroundTaskManager: endBackgroundTask
default	06:41:41.647123-0800	Strum Machine	0x10d14c000 - [PID=82994] WebProcessProxy::didFinishLaunching:
default	06:41:41.657763-0800	Strum Machine	0x10d14c170 - [PID=82994] ProcessThrottler::didConnectToProcess:
default	06:41:41.658499-0800	Strum Machine	0x10d14c170 - [PID=82994] ProcessThrottler::setAssertionType: Updating process assertion type to 3 (foregroundActivities=2, backgroundActivities=5)
default	06:41:41.658689-0800	Strum Machine	0x2813a0f30 - WKProcessAssertionBackgroundTaskManager: beginBackgroundTaskWithName
default	06:41:41.658967-0800	Strum Machine	WKProcessAssertionBackgroundTaskManager: Took a FinishTaskInterruptable assertion for own process
default	06:41:41.659172-0800	Strum Machine	0x10d14c000 - [PID=82994] WebProcessProxy::didSetAssertionType: type=3
default	06:41:41.659341-0800	Strum Machine	0x10d14c000 - [PID=82994] WebProcessProxy::didSetAssertionType(Foreground) Taking foreground assertion for network process
default	06:41:41.660033-0800	Strum Machine	0x105be4c30 - [PID=0, throttler=0x105b65e88] ProcessThrottler::Activity::Activity: Starting foreground activity / 'Networking for foreground view(s)'
debug	06:41:41.660176-0800	Strum Machine	looked up value 1 for key RemoteInspectorEnabled in CFPrefsPlistSource<0x2833df380> (Domain: com.apple.webinspectord, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No) via CFPrefsSearchListSource<0x2833dcc80> (Domain: com.apple.webinspectord, Container: (null))
default	06:41:41.660319-0800	Strum Machine	sceneOfRecord: sceneID: sceneID:com.strummachine.mobileapp-default  persistentID: CB336D6E-04B1-492F-9085-5DE154C708FC
default	06:41:41.672615-0800	Strum Machine	0x105b65db0 - NetworkProcessProxy is taking a background assertion because a web process is requesting a connection
default	06:41:41.675045-0800	Strum Machine	sceneOfRecord: sceneID: sceneID:com.strummachine.mobileapp-default  persistentID: CB336D6E-04B1-492F-9085-5DE154C708FC
info	06:41:41.675261-0800	Strum Machine	Acquiring assertion: <RBSAssertionDescriptor| "WebKit UIProcess background task" ID:(null) target:81581>
default	06:41:41.675616-0800	Strum Machine	[0x2836d9ea0] Scene target of event deferring environments did update: scene: 0x1032093f0; current systemShellManagesKeyboardFocus: 1; systemShellManagesKeyboardFocusForScene: 1; eligibleForRecordRemoval: 1;
default	06:41:41.676043-0800	Strum Machine	Scene became target of keyboard event deferring environment: UIWindowScene: 0x1032093f0; scene identity: com.apple.frontboard.systemappservices::sceneID%3Acom.strummachine.mobileapp-default
debug	06:41:41.685647-0800	Strum Machine	Adding assertion 32-81581-819005 to dictionary
debug	06:41:41.685682-0800	Strum Machine	Received message from server: async_didChangeInheritances:completion:
info	06:41:41.685830-0800	Strum Machine	Acquiring assertion: <RBSAssertionDescriptor| "WebProcess Foreground Assertion" ID:(null) target:82994>
info	06:41:41.685866-0800	Strum Machine	didChangeInheritances: <RBSInheritanceChangeSet| gained:{(
    <RBSInheritance| environment:UIScene:com.apple.frontboard.systemappservices::sceneID%3Acom.strummachine.mobileapp-default name:com.apple.frontboard.visibility origID:32-73482-819004 payload>
)} lost:(null)>
debug	06:41:41.692529-0800	Strum Machine	Adding assertion 32-81581-819007 to dictionary
default	06:41:41.692568-0800	Strum Machine	0x105bf8540 - ProcessAssertion: Successfully took RBS assertion 'WebProcess Foreground Assertion' for process with PID=82994
default	06:41:41.697400-0800	Strum Machine	0x105b65e88 - [PID=82995] ProcessThrottler::didConnectToProcess:
default	06:41:41.697783-0800	Strum Machine	0x105b65e88 - [PID=82995] ProcessThrottler::setAssertionType: Updating process assertion type to 3 (foregroundActivities=1, backgroundActivities=1)
info	06:41:41.702567-0800	Strum Machine	Acquiring assertion: <RBSAssertionDescriptor| "NetworkProcess Foreground Assertion" ID:(null) target:82995>
debug	06:41:41.702708-0800	Strum Machine	Adding assertion 32-81581-819009 to dictionary
default	06:41:41.702778-0800	Strum Machine	0x105bf85a0 - ProcessAssertion: Successfully took RBS assertion 'NetworkProcess Foreground Assertion' for process with PID=82995
default	06:41:41.721096-0800	Strum Machine	0x105be4440 - [PID=82994, throttler=0x10d14c170] ProcessThrottler::Activity::invalidate: Ending background activity / 'WebProcess initialization'
default	06:41:41.732506-0800	Strum Machine	Created visibility propagation view 0x108f1c250 (contextID=1074028736) for WebContent process with PID=82994
info	06:41:41.732665-0800	Strum Machine	Acquiring assertion: <RBSAssertionDescriptor| "injecting inherited from "UIScene:com.apple.frontboard.systemappservices::sceneID%3Acom.strummachine.mobileapp-default" to 82994<UIHostedWindow:400460c0>" ID:(null) target:82994<UIHostedWindow:400460c0>>
debug	06:41:41.733716-0800	Strum Machine	Adding assertion 32-81581-819010 to dictionary
default	06:41:41.736721-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=82994] WebPageProxy::decidePolicyForNavigationAction: frameID=3, navigationID=2
info	06:41:41.736874-0800	Strum Machine	Look up a url
debug	06:41:41.736913-0800	Strum Machine	Look up a url http://localhost:12000/app
info	06:41:41.736949-0800	Strum Machine	Send GetDatabases message to safe browsing service with protection type 1
info	06:41:41.737095-0800	Strum Machine	Already waiting for GetDatabases response with protection type 1
default	06:41:41.737308-0800	Strum Machine	0x105be5310 - SOAuthorizationCoordinator::tryAuthorize
debug	06:41:41.737365-0800	Strum Machine	+[SOAuthorizationCore _doAKshouldProcessURL:] URL = http://localhost:12000/app, result = NO on SOAuthorizationCore
debug	06:41:41.737548-0800	Strum Machine	+[SOAuthorizationCore canPerformAuthorizationWithURL:responseCode:callerBundleIdentifier:useInternalExtensions:] http://localhost:12000/app, responseCode = 0, callerBundleIdentifier = (null), useInternalExtensions = YES, result = NO on SOAuthorizationCore
default	06:41:41.737581-0800	Strum Machine	0x105be5310 - SOAuthorizationCoordinator::tryAuthorize: Cannot authorize the requested URL.
info	06:41:41.737705-0800	Strum Machine	Receive GetDatabases response from safe browsing service with protection type: 1
info	06:41:41.737740-0800	Strum Machine	Receive GetDatabases response from safe browsing service
info	06:41:41.737946-0800	Strum Machine	Perform url lookup in the database
debug	06:41:41.738147-0800	Strum Machine	Perform url lookup in the database: http://localhost:12000/app
info	06:41:41.742635-0800	Strum Machine	There are no matches in databases with given url
debug	06:41:41.742728-0800	Strum Machine	There are no matches in databases with given url: http://localhost:12000/app
default	06:41:41.742768-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=82994] WebPageProxy::decidePolicyForNavigationAction: listener called: frameID=3, navigationID=2, policyAction=0, safeBrowsingWarning=0, isAppBoundDomain=0
default	06:41:41.743037-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=82994] WebPageProxy::receivedNavigationPolicyDecision: frameID=3, navigationID=2, policyAction=0
default	06:41:41.743236-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=82994] WebPageProxy::decidePolicyForNavigationAction: keep using process 82994 for navigation, reason=Process has not yet committed any provisional loads
info	06:41:41.743551-0800	Strum Machine	Received ClientInUse reply
default	06:41:41.750989-0800	Strum Machine	0x105be4770 - [PID=82994, throttler=0x10d14c170] ProcessThrottler::Activity::invalidate: Ending foreground activity / 'WebPageProxy::runJavaScriptInFrameInScriptWorld'
default	06:41:41.752646-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=82994] WebPageProxy::didStartProvisionalLoadForFrame: frameID=3
default	06:41:41.752746-0800	Strum Machine	0x10d14c000 - [PID=82994] WebProcessProxy::didStartProvisionalLoadForMainFrame:
default	06:41:41.752907-0800	Strum Machine	IAB.close() called but it was already closed.
default	06:41:41.836173-0800	Strum Machine	-[UIApplication __beginBackgroundTaskWithExpirationHandler:]: Will add backgroundTask with taskName: Called by Strum Machine, from -[GCDWebServer _startBackgroundTask], expirationHandler: <__NSMallocBlock__: 0x28131c240>
default	06:41:41.836349-0800	Strum Machine	_UIBackgroundTaskInfo *_addBackgroundTask(NSString *__strong, void (^__strong)(void)): Created background task <_UIBackgroundTaskInfo: 0x280771680>: taskID = 0, taskName = Called by Strum Machine, from -[GCDWebServer _startBackgroundTask], creationTime = 2012477 (elapsed = 0). Assertion will be assigned soon
default	06:41:41.836611-0800	Strum Machine	_UIBackgroundTaskInfo *_addBackgroundTask(NSString *__strong, void (^__strong)(void))_block_invoke: Creating new assertion since assertion is nil
default	06:41:41.837971-0800	Strum Machine	_UIBackgroundTaskInfo *_addBackgroundTask(NSString *__strong, void (^__strong)(void))_block_invoke: Created new assertion <BKSProcessAssertion: 0x283e845a0>
info	06:41:41.838376-0800	Strum Machine	Acquiring assertion: <RBSAssertionDescriptor| "Shared Background Assertion 4 for com.strummachine.mobileapp" ID:(null) target:81581>
debug	06:41:41.838452-0800	Strum Machine	Adding assertion 32-81581-819012 to dictionary
default	06:41:41.877154-0800	Strum Machine	sceneOfRecord: sceneID: sceneID:com.strummachine.mobileapp-default  persistentID: CB336D6E-04B1-492F-9085-5DE154C708FC
default	06:41:41.877275-0800	Strum Machine	Deactivation reason removed: 12; deactivation reasons: 4128 -> 32; animating application lifecycle event: 1
default	06:41:41.877330-0800	Strum Machine	Deactivation reason removed: 5; deactivation reasons: 32 -> 0; animating application lifecycle event: 0
default	06:41:41.877389-0800	Strum Machine	0x105be5100 - [PID=82994, throttler=0x10d14c170] ProcessThrottler::Activity::Activity: Starting foreground activity / 'WebPageProxy::runJavaScriptInFrameInScriptWorld'
default	06:41:41.878221-0800	Strum Machine	0x105be5100 - [PID=82994, throttler=0x10d14c170] ProcessThrottler::Activity::invalidate: Ending foreground activity / 'WebPageProxy::runJavaScriptInFrameInScriptWorld'
default	06:41:41.884788-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=82994] WebPageProxy::didNavigateWithNavigationDataShared:
default	06:41:41.886626-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=82994] WebPageProxy::didCommitLoadForFrame: frameID=3
default	06:41:41.886995-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=82994] WebPageProxy::didFinishDocumentLoadForFrame: frameID=3
default	06:41:41.891900-0800	Strum Machine	0x104024e18 - [pageProxyID=11, webPageID=12, PID=82994] WebPageProxy::didFinishLoadForFrame: frameID=3
default	06:41:41.891954-0800	Strum Machine	0x105bf9080 - NavigationState will release its process network assertion soon because the page load completed
default	06:41:41.892079-0800	Strum Machine	The preference key "AutoHideSplashScreen" is not defined and will default to "TRUE"
default	06:41:42.751935-0800	Strum Machine	-[UIApplication _endBackgroundTask:]: Ending background task with UIBackgroundTaskIdentifier: 11
default	06:41:42.752084-0800	Strum Machine	-[UIApplication _endBackgroundTask:]: Ending task with identifier 11 and description: <_UIBackgroundTaskInfo: 0x280771680>: taskID = 11, taskName = Called by Strum Machine, from -[GCDWebServer _startBackgroundTask], creationTime = 2012477 (elapsed = 1), _expireHandler: <__NSMallocBlock__: 0x28131c240>
default	06:41:42.752228-0800	Strum Machine	-[UIApplication _endBackgroundTask:]_block_invoke: Decrementing reference count for assertion used by background task with identifier 11: <_UIBackgroundTaskInfo: 0x280771680>: taskID = 11, taskName = Called by Strum Machine, from -[GCDWebServer _startBackgroundTask], creationTime = 2012477 (elapsed = 1)
default	06:41:42.752285-0800	Strum Machine	-[UIApplication _endBackgroundTask:]_block_invoke: Will invalidate assertion: <BKSProcessAssertion: 0x283e845a0> for task identifier: 11
default	06:41:44.856894-0800	Strum Machine	0x105bf9080 NavigationState is releasing background process assertion because a page load completed
default	06:41:44.857187-0800	Strum Machine	0x105be4680 - [PID=82994, throttler=0x10d14c170] ProcessThrottler::Activity::invalidate: Ending background activity / 'Page Load'
default	06:42:11.528249-0800	Strum Machine	Could not signal service com.apple.WebKit.WebContent: 113: Could not find specified service
default	06:42:11.528434-0800	Strum Machine	0x105bf83c0 - ~ProcessAssertion: Releasing process assertion 'ConnectionTerminationWatchdog' for process with PID=0

Connecting the Safari Web Inspector shows a blank page (<html><head></head><body><body/></html>) and no Javascript is loaded. Refreshing the page from the Web Inspector has no effect; onReset is called in my plugin, but that’s about it from the logs. Sentry isn’t catching any exceptions either.

I’ve looked through all the old Github issues that reference opening to a blank screen in Cordova. Most are pretty old and/or seem to differ from what I’m seeing or otherwise not apply. This issue from @Nauzer might be relevant though: Webapp Forced Reload blank page · Issue #94 · meteor/cordova-plugin-meteor-webapp · GitHub

Have any of you seen or heard of this problem in your apps lately? Any idea what might be going on?

Update: I posted this on Github Issues as well:
White screen of death when reopening iOS Cordova app · Issue #11811 · meteor/meteor · GitHub

3 Likes

We used to get this… the trick was to make sure we build using /production flag before submitting to App Store. I think it was a mismatch between build types from what was submitted to store vs what was living on the web server. Good luck.

@oemig Thanks. I’m pretty sure this is something different though. 1) Server and app are both built with meteor build, i.e., for production. 2) It happens with both prod server/app and local dev server/app. 3) It does update itself OK, it’s just that sometimes restarting the app is needed to get around the WSoD.

yeah… that does sound different. When there is a build-type mismatch, there is no workaround for white screen of death. Boy do I hate that WSoD.

Good luck!

1 Like

Have you found any fix yet mate?

We do always see the white screen flashing right after the splash screen but then goes to a loader and then to the app main menu in Android.

But post upgrading to the latest meteor version something is missing in the IoS build that the app doesn’t go past the white screen. So the Appstore folks are pushing us back to fix it.

Jay

Not yet. There’s been quite a bit of discussion about this on the Github Issue but nobody’s been able to nail down a solution. Factionfour mentioned that they seemed to get the issue after upgrading Xcode to 12.5.1, not the Cordova platform version. I thought that was very interesting and want to try building an app with an older version of Xcode (not sure how old) to see if that fixes it. But so far I’ve been occupied with an unrelated project and haven’t had a chance to investigate further. Do report back if you give it a try, and I’ll do the same!

Yesterday I built the app with Xcode 12.4 and installed it on my phone. This morning, I got the same white screen of death. :confused: That’s the oldest version of Xcode I can use because of a Swift package (AudioKit) that my app relies on. So I have no leads to follow up on at this point. *Sigh…*

We tried upgrading to latest version of Meteor as it supports Mac M1 Chip and latest version of Xcode. We had some build issues. We took support again and we were able to build… But again we ran into WSOD on all devices i.e iOS, Android and Web.

We raised this to the support team and we are asked to check our flow routers

The trusted source for JavaScript packages, Meteor resources and tools | Atmosphere is deprecated apparently…

We should use this package apparently The trusted source for JavaScript packages, Meteor resources and tools | Atmosphere

The issue is addressed in this forum…

We are trying this tomorrow but sharing it just in case it may work for you. We are trying with the latest meteor version though.

Good luck
Jay

I’ve been using ostrio:flow-router-extra (for a couple years now) as well as the latest Meteor and Xcode versions. Besides, I really don’t think this is a JS issue as there is no Javascript loaded when the WSOD happens; if you inspect with Safari you’ll see a blank html file with no global Meteor object or anything.

1 Like

@banjerluke while looking for a solution for this I noticed cordova-plugin-splashscreen being mentioned as the source of the problem. Do you use this plugin?

In the same post "routing config needed to be altered to use useHash: true," is also mentioned. Not sure if that could make sense in relation to how Meteor hot-code-push and/or app resume works.

Source: White screen of death after switching to Cordova iOS 6.1.0 - Stack Overflow

@dotmlj I do use that plugin, but at one point I removed all of my Cordova plugins (including that one) and it still white-screened.

The thing about the routing config seems to pertain to Angular, which I don’t use. Also, that person was having the HTML template and JS load but there was no content, whereas in this case nothing is loaded, not even the static HTML from Meteor or the JS files.

Thanks for your ideas though!

@banjerluke any new related to this? We are still experiencing the issue :expressionless:

Yeah, me too. :confused: I’m at a dead end with this issue.

Same here. Find it quite hard to reproduce / debug. Any idea on that would be really helpful. Quite annoying for ux.

The GitHub Issue I posted has more info on what’s been tried and what leads have been followed, in case you want to look – maybe you’ll think of something I missed.

It might not be related at all but we got the white screen on a PWA apps on iOS as well.

The issue turned out to be due to an error during the startup code which does a fetch that fails when having unstable connection. Specifically when the wi-fi signal is on but the internet is not available.