Bring back the background refresh stop sync crash fix, this time with a forced conformance to the main actor.

- follow up to https://github.com/element-hq/element-x-ios/pull/3942 and https://github.com/element-hq/element-x-ios/pull/3946
This commit is contained in:
Stefan Ceriu
2025-03-31 08:49:57 +03:00
committed by Stefan Ceriu
parent 901c833c40
commit d5f9860898
@@ -895,9 +895,12 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
// Attempt to stop the background task sync loop cleanly, only if the app not already running // Attempt to stop the background task sync loop cleanly, only if the app not already running
return return
} }
MainActor.assumeIsolated {
userSession?.clientProxy.stopSync(completion: completion) userSession?.clientProxy.stopSync(completion: completion)
clientProxyObserver = nil clientProxyObserver = nil
} }
}
private func startSync() { private func startSync() {
guard let userSession else { return } guard let userSession else { return }
@@ -1038,14 +1041,22 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
// This is important for the app to keep refreshing in the background // This is important for the app to keep refreshing in the background
scheduleBackgroundAppRefresh() scheduleBackgroundAppRefresh()
task.expirationHandler = { [weak self] in /// We have a lot of crashes stemming here which we previously believed are caused by stopSync not being async
/// on the client proxy side (see the comment on that method). We have now realised that will likely not fix anything but
/// we also noticed this does not crash on the main thread, even though the whole AppCoordinator is on the Main actor.
/// As such, we introduced a MainActor conformance on the expirationHandler but we are also assuming main actor
/// isolated in the `stopSync` method above.
/// https://sentry.tools.element.io/organizations/element/issues/4477794/
task.expirationHandler = { @Sendable [weak self] in
MXLog.info("Background app refresh task is about to expire.") MXLog.info("Background app refresh task is about to expire.")
Task { @MainActor in
self?.stopSync(isBackgroundTask: true) { self?.stopSync(isBackgroundTask: true) {
MXLog.info("Marking Background app refresh task as complete.") MXLog.info("Marking Background app refresh task as complete.")
task.setTaskCompleted(success: true) task.setTaskCompleted(success: true)
} }
} }
}
guard let userSession else { guard let userSession else {
return return