diff --git a/ElementX/Sources/Application/AppCoordinator.swift b/ElementX/Sources/Application/AppCoordinator.swift index 6b0d7d7be..c4967419e 100644 --- a/ElementX/Sources/Application/AppCoordinator.swift +++ b/ElementX/Sources/Application/AppCoordinator.swift @@ -1302,7 +1302,11 @@ private extension AppCoordinator { } } + await waitForSessionRestore() + guard let userSession else { + MXLog.info("Background app refresh: no user session, giving up.") + task.setTaskCompleted(success: false) return } @@ -1393,3 +1397,15 @@ private extension AppCoordinator { task.setTaskCompleted(success: true) } } + +private extension AppCoordinator { + /// When iOS relaunches a terminated app for a background task, the session is still being restored asynchronously. + func waitForSessionRestore() async { + let deadline = ContinuousClock.now + .seconds(5) + while userSession == nil, + stateMachine.state == .initial || stateMachine.state == .restoringSession, + ContinuousClock.now < deadline { + try? await Task.sleep(for: .milliseconds(100)) + } + } +}