From d275aa70f277f8a68c3308334849c7a20a87ea2a Mon Sep 17 00:00:00 2001 From: Nora Trapp Date: Thu, 24 Jun 2021 14:37:16 -0700 Subject: [PATCH] Wake the app when network becomes available --- ...ConversationViewController+Delegates.swift | 2 +- .../src/Network/ReachabilityManager.swift | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController+Delegates.swift b/Signal/src/ViewControllers/ConversationView/ConversationViewController+Delegates.swift index 52ef91fb17..5cb1516f12 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController+Delegates.swift +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController+Delegates.swift @@ -488,7 +488,7 @@ extension ConversationViewController: ConversationCollectionViewDelegate { private func scrollingAnimationCompletionTimerDidFire(_ timer: Timer) { AssertIsOnMainThread() - owsFailDebug("Scrolling animation did not complete in a timely way.") + Logger.warn("Scrolling animation did not complete in a timely way.") // scrollingAnimationCompletionTimer should already have been cleared, // but we need to ensure that it is cleared in a timely way. diff --git a/SignalServiceKit/src/Network/ReachabilityManager.swift b/SignalServiceKit/src/Network/ReachabilityManager.swift index 1e82f74012..7f77bf8304 100644 --- a/SignalServiceKit/src/Network/ReachabilityManager.swift +++ b/SignalServiceKit/src/Network/ReachabilityManager.swift @@ -47,6 +47,10 @@ public extension SSKReachabilityManager { @objc public class SSKReachabilityManagerImpl: NSObject, SSKReachabilityManager { + private let backgroundSession = OWSURLSession( + securityPolicy: OWSURLSession.signalServiceSecurityPolicy, + configuration: .background(withIdentifier: "backgroundSession") + ) private let reachability: Reachability public var observationContext: AnyObject { @@ -100,6 +104,8 @@ public class SSKReachabilityManagerImpl: NSObject, SSKReachabilityManager { Logger.verbose("isReachable: \(isReachable)") NotificationCenter.default.post(name: SSKReachability.owsReachabilityDidChange, object: self.observationContext) + + scheduleWakeupRequestIfNecessary() } private func startNotifier() { @@ -112,6 +118,25 @@ public class SSKReachabilityManagerImpl: NSObject, SSKReachabilityManager { return } Logger.debug("started notifier") + + scheduleWakeupRequestIfNecessary() + } + + private func scheduleWakeupRequestIfNecessary() { + // Start a background session to wake the app when the network + // becomes available. We start this immediately when we lose + // connectivity rather than waiting until the app is backgrounded, + // because if started while backgrounded when the app is woken up + // will be at the OSes discretion. + guard !isReachable else { return } + + Logger.info("Scheduling wakeup request for pending message sends.") + + backgroundSession.urlDownloadTaskPromise(TSConstants.textSecureServerURL, method: .get).done { _ in + Logger.info("Finished wakeup request.") + }.catch { error in + Logger.info("Failed wakeup request \(error)") + } } }