From 29c6d51e6a0365422ec8f123ba434549b565f07a Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Sat, 2 Jul 2022 08:50:25 +0100 Subject: [PATCH] ios: fix background refresh (#769) * ios: fix background refresh * change app inactive check --- apps/ios/Shared/AppDelegate.swift | 15 +++++---------- apps/ios/Shared/Model/BGManager.swift | 11 ++++++++--- apps/ios/Shared/Model/SimpleXAPI.swift | 3 +-- apps/ios/Shared/Model/SuspendChat.swift | 9 +++++++++ apps/ios/Shared/SimpleXApp.swift | 3 --- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/apps/ios/Shared/AppDelegate.swift b/apps/ios/Shared/AppDelegate.swift index 64f963e973..0add3347ba 100644 --- a/apps/ios/Shared/AppDelegate.swift +++ b/apps/ios/Shared/AppDelegate.swift @@ -61,17 +61,12 @@ class AppDelegate: NSObject, UIApplicationDelegate { completionHandler(.noData) } } else if let checkMessages = ntfData["checkMessages"] as? Bool, checkMessages { - // TODO check if app in background logger.debug("AppDelegate: didReceiveRemoteNotification: checkMessages") - // TODO remove - // NtfManager.shared.notifyCheckingMessages() - completionHandler(.noData) -// receiveMessages(completionHandler) - } else if let smpQueue = ntfData["checkMessage"] as? String { - // TODO check if app in background - logger.debug("AppDelegate: didReceiveRemoteNotification: checkMessage \(smpQueue)") - completionHandler(.noData) -// receiveMessages(completionHandler) + if isAppInactive() { + receiveMessages(completionHandler) + } else { + completionHandler(.noData) + } } else { completionHandler(.noData) } diff --git a/apps/ios/Shared/Model/BGManager.swift b/apps/ios/Shared/Model/BGManager.swift index 6f35732d15..6468d3b08a 100644 --- a/apps/ios/Shared/Model/BGManager.swift +++ b/apps/ios/Shared/Model/BGManager.swift @@ -47,11 +47,16 @@ class BGManager { private func handleRefresh(_ task: BGAppRefreshTask) { logger.debug("BGManager.handleRefresh") schedule() - let completeRefresh = completionHandler { + if isAppInactive() { + let completeRefresh = completionHandler { + task.setTaskCompleted(success: true) + } + task.expirationHandler = { completeRefresh("expirationHandler") } + receiveMessages(completeRefresh) + } else { + logger.debug("BGManager.completionHandler: already active, not started") task.setTaskCompleted(success: true) } - task.expirationHandler = { completeRefresh("expirationHandler") } - receiveMessages(completeRefresh) } func completionHandler(_ complete: @escaping () -> Void) -> ((String) -> Void) { diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index fc2a782290..e2f9ecd016 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -564,8 +564,7 @@ class ChatReceiver { await processReceivedMsg(msg) } if self.receiveMessages { - do { try await Task.sleep(nanoseconds: 7_500_000) } - catch { logger.error("receiveMsgLoop: Task.sleep error: \(error.localizedDescription)") } + _ = try? await Task.sleep(nanoseconds: 7_500_000) await receiveMsgLoop() } } diff --git a/apps/ios/Shared/Model/SuspendChat.swift b/apps/ios/Shared/Model/SuspendChat.swift index ab552ad9f7..e2bd313e6b 100644 --- a/apps/ios/Shared/Model/SuspendChat.swift +++ b/apps/ios/Shared/Model/SuspendChat.swift @@ -7,6 +7,7 @@ // import Foundation +import UIKit import SimpleXChat private let suspendLockQueue = DispatchQueue(label: "chat.simplex.app.suspend.lock") @@ -37,9 +38,13 @@ func suspendBgRefresh() { } func chatSuspended() { + logger.debug("chatSuspended") suspendLockQueue.sync { if case .suspending = appStateGroupDefault.get() { appStateGroupDefault.set(.suspended) + if ChatModel.shared.chatRunning == true { + ChatReceiver.shared.stop() + } } } } @@ -50,3 +55,7 @@ func activateChat(appState: AppState = .active) { apiActivateChat() } } + +func isAppInactive() -> Bool { + UIApplication.shared.applicationState != .active && appStateGroupDefault.get().inactive +} diff --git a/apps/ios/Shared/SimpleXApp.swift b/apps/ios/Shared/SimpleXApp.swift index a79f7bab83..398bb70d81 100644 --- a/apps/ios/Shared/SimpleXApp.swift +++ b/apps/ios/Shared/SimpleXApp.swift @@ -51,9 +51,6 @@ struct SimpleXApp: App { switch (phase) { case .background: suspendChat() - if chatModel.chatRunning == true { - ChatReceiver.shared.stop() - } BGManager.shared.schedule() if userAuthorized == true { enteredBackground = ProcessInfo.processInfo.systemUptime