From c7cfe188ee819308d2e596fe013620f584af26f4 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 6 Oct 2017 12:00:29 -0400 Subject: [PATCH 1/3] Sync push tokens on background launch as well // FREEBIE --- Signal/src/AppDelegate.m | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 01f9bdd9a..14c728d06 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -271,23 +271,26 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - DDLogDebug(@"%@ Successfully registered for remote notifications with token: %@", self.tag, deviceToken); + DDLogDebug(@"%@ registered vanilla push token: %@", self.tag, deviceToken); [PushManager.sharedManager.pushNotificationFutureSource trySetResult:deviceToken]; } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { - OWSProdError([OWSAnalyticsEvents appDelegateErrorFailedToRegisterForRemoteNotifications]); + DDLogDebug(@"%@ failed to register vanilla push token with error: %@", self.tag, error); #ifdef DEBUG DDLogWarn(@"%@ We're in debug mode. Faking success for remote registration with a fake push identifier", self.tag); [PushManager.sharedManager.pushNotificationFutureSource trySetResult:[[NSMutableData dataWithLength:32] copy]]; #else + OWSProdError([OWSAnalyticsEvents appDelegateErrorFailedToRegisterForRemoteNotifications]); [PushManager.sharedManager.pushNotificationFutureSource trySetFailure:error]; #endif } - (void)application:(UIApplication *)application - didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { + didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings +{ + DDLogDebug(@"%@ registered user notification settings", self.tag); [PushManager.sharedManager.userNotificationFutureSource trySetResult:notificationSettings]; } @@ -480,13 +483,8 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; // At this point, potentially lengthy DB locking migrations could be running. // Avoid blocking app launch by putting all further possible DB access in async block dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - DDLogInfo( - @"%@ running post launch block for registered user: %@", self.tag, [TSAccountManager localNumber]); - __unused AnyPromise *promise = - [OWSSyncPushTokensJob runWithPushManager:[PushManager sharedManager] - accountManager:[Environment getCurrent].accountManager - preferences:[Environment preferences]]; - + DDLogInfo(@"%@ running post launch block for registered user: %@", self.tag, [TSAccountManager localNumber]); + // Clean up any messages that expired since last launch immediately // and continue cleaning in the background. [[OWSDisappearingMessagesJob sharedJob] startIfNecessary]; @@ -819,6 +817,11 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; if ([TSAccountManager isRegistered]) { DDLogInfo(@"localNumber: %@", [TSAccountManager localNumber]); + + // This should happen at any launch, background or foreground. + __unused AnyPromise *promise = [OWSSyncPushTokensJob runWithPushManager:[PushManager sharedManager] + accountManager:[Environment getCurrent].accountManager + preferences:[Environment preferences]]; } [DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self]; From 876521f4c3b447b5d9e85eb63200f015ca1fb099 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 6 Oct 2017 12:03:41 -0400 Subject: [PATCH 2/3] Fetch messages sooner when launched from background The only reason a notification wakes/launches the app is to fetch messages. However, upon launching, especially if the app had been killed, it can take a second or two before being notified of the notification that woke us. Rather than wait, just fetch messages ASAP. // FREEBIE --- Signal/src/AppDelegate.m | 5 +++++ Signal/src/environment/Environment.h | 3 ++- Signal/src/environment/Environment.m | 17 +++++++++++++++++ Signal/src/network/PushManager.m | 25 +++++++++---------------- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 14c728d06..68ffd9e21 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -818,6 +818,11 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; if ([TSAccountManager isRegistered]) { DDLogInfo(@"localNumber: %@", [TSAccountManager localNumber]); + // Fetch messages as soon as possible after launching. In particular, when + // launching from the background, without this, we end up waiting some extra + // seconds before receiving an actionable push notification. + [[Environment getCurrent].messageFetcherJob runAsync]; + // This should happen at any launch, background or foreground. __unused AnyPromise *promise = [OWSSyncPushTokensJob runWithPushManager:[PushManager sharedManager] accountManager:[Environment getCurrent].accountManager diff --git a/Signal/src/environment/Environment.h b/Signal/src/environment/Environment.h index 8a0c4dda6..966c7174f 100644 --- a/Signal/src/environment/Environment.h +++ b/Signal/src/environment/Environment.h @@ -27,6 +27,7 @@ @class CallService; @class OWSMessageSender; @class NotificationsManager; +@class OWSMessageFetcherJob; @interface Environment : NSObject @@ -46,7 +47,7 @@ @property (nonatomic, readonly) NotificationsManager *notificationsManager; @property (nonatomic, readonly) OWSMessageSender *messageSender; @property (nonatomic, readonly) OWSPreferences *preferences; - +@property (nonatomic, readonly) OWSMessageFetcherJob *messageFetcherJob; @property (nonatomic, readonly) HomeViewController *homeViewController; @property (nonatomic, readonly, weak) UINavigationController *signUpFlowNavigationController; diff --git a/Signal/src/environment/Environment.m b/Signal/src/environment/Environment.m index a20dcb7e2..683b0d9c9 100644 --- a/Signal/src/environment/Environment.m +++ b/Signal/src/environment/Environment.m @@ -13,6 +13,8 @@ #import "TSGroupThread.h" #import #import +#import +#import static Environment *environment = nil; @@ -23,6 +25,7 @@ static Environment *environment = nil; callService = _callService, contactsManager = _contactsManager, contactsUpdater = _contactsUpdater, + messageFetcherJob = _messageFetcherJob, messageSender = _messageSender, networkManager = _networkManager, notificationsManager = _notificationsManager, @@ -137,6 +140,20 @@ static Environment *environment = nil; return _networkManager; } +- (OWSMessageFetcherJob *)messageFetcherJob +{ + @synchronized(self) + { + if (!_messageFetcherJob) { + _messageFetcherJob = + [[OWSMessageFetcherJob alloc] initWithMessageReceiver:[OWSMessageReceiver sharedInstance] + networkManager:self.networkManager + signalService:[OWSSignalService sharedInstance]]; + } + } + return _messageFetcherJob; +} + - (OWSMessageSender *)messageSender { OWSAssert(_messageSender != nil); diff --git a/Signal/src/network/PushManager.m b/Signal/src/network/PushManager.m index bc75a3766..9a6be0e29 100644 --- a/Signal/src/network/PushManager.m +++ b/Signal/src/network/PushManager.m @@ -52,18 +52,16 @@ NSString *const Signal_Message_MarkAsRead_Identifier = @"Signal_Message_MarkAsRe - (instancetype)initDefault { - return [self initWithNetworkManager:[Environment getCurrent].networkManager - storageManager:[TSStorageManager sharedManager] - callUIAdapter:[Environment getCurrent].callService.callUIAdapter - messageReceiver:[OWSMessageReceiver sharedInstance] - messageSender:[Environment getCurrent].messageSender]; + return [self initWithMessageFetcherJob:[Environment getCurrent].messageFetcherJob + storageManager:[TSStorageManager sharedManager] + callUIAdapter:[Environment getCurrent].callService.callUIAdapter + messageSender:[Environment getCurrent].messageSender]; } -- (instancetype)initWithNetworkManager:(TSNetworkManager *)networkManager - storageManager:(TSStorageManager *)storageManager - callUIAdapter:(CallUIAdapter *)callUIAdapter - messageReceiver:(OWSMessageReceiver *)messageReceiver - messageSender:(OWSMessageSender *)messageSender +- (instancetype)initWithMessageFetcherJob:(OWSMessageFetcherJob *)messageFetcherJob + storageManager:(TSStorageManager *)storageManager + callUIAdapter:(CallUIAdapter *)callUIAdapter + messageSender:(OWSMessageSender *)messageSender { self = [super init]; if (!self) { @@ -72,12 +70,7 @@ NSString *const Signal_Message_MarkAsRead_Identifier = @"Signal_Message_MarkAsRe _callUIAdapter = callUIAdapter; _messageSender = messageSender; - - OWSSignalService *signalService = [OWSSignalService sharedInstance]; - _messageFetcherJob = [[OWSMessageFetcherJob alloc] initWithMessageReceiver:messageReceiver - networkManager:networkManager - signalService:signalService]; - + _messageFetcherJob = messageFetcherJob; _callBackgroundTask = UIBackgroundTaskInvalid; _currentNotifications = [NSMutableArray array]; From b5258be9b5ee8a99922709d81c035710c266b174 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 6 Oct 2017 18:07:37 -0400 Subject: [PATCH 3/3] respond to code review // FREEBIE --- Signal/src/AppDelegate.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 68ffd9e21..77bd15809 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -271,13 +271,13 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - DDLogDebug(@"%@ registered vanilla push token: %@", self.tag, deviceToken); + DDLogInfo(@"%@ registered vanilla push token: %@", self.tag, deviceToken); [PushManager.sharedManager.pushNotificationFutureSource trySetResult:deviceToken]; } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { - DDLogDebug(@"%@ failed to register vanilla push token with error: %@", self.tag, error); + DDLogError(@"%@ failed to register vanilla push token with error: %@", self.tag, error); #ifdef DEBUG DDLogWarn(@"%@ We're in debug mode. Faking success for remote registration with a fake push identifier", self.tag); [PushManager.sharedManager.pushNotificationFutureSource trySetResult:[[NSMutableData dataWithLength:32] copy]]; @@ -290,7 +290,7 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { - DDLogDebug(@"%@ registered user notification settings", self.tag); + DDLogInfo(@"%@ registered user notification settings", self.tag); [PushManager.sharedManager.userNotificationFutureSource trySetResult:notificationSettings]; }