diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index d02602b20..53e8e977e 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -76,14 +76,6 @@ -(void)reset; ARTRest *const rest = [[ARTRest alloc] initWithOptions:options.clientOptions]; [instanceStore setRest:rest with: handle]; - NSData *const apnsDeviceToken = ably.instanceStore.didRegisterForRemoteNotificationsWithDeviceToken_deviceToken; - NSError *const error = ably.instanceStore.didFailToRegisterForRemoteNotificationsWithError_error; - if (apnsDeviceToken != nil) { - [ARTPush didRegisterForRemoteNotificationsWithDeviceToken:apnsDeviceToken rest:rest]; - } else if (error != nil) { - [ARTPush didFailToRegisterForRemoteNotificationsWithError:error rest:rest]; - } - result(handle); }; @@ -262,19 +254,6 @@ -(void)reset; } ARTRealtime *const realtime = [[ARTRealtime alloc] initWithOptions:options.clientOptions]; [instanceStore setRealtime:realtime with:handle]; - - // Giving Ably client the deviceToken registered at device launch (didRegisterForRemoteNotificationsWithDeviceToken). - // This is not an ideal solution. We save the deviceToken given in didRegisterForRemoteNotificationsWithDeviceToken and the - // error in didFailToRegisterForRemoteNotificationsWithError and pass it to Ably in the first client that is first created. - // Ideally, the Ably client doesn't need to be created, and we can pass the deviceToken to Ably like in Ably Java. - // This is similarly repeated for in _createRest - NSData *const apnsDeviceToken = ably.instanceStore.didRegisterForRemoteNotificationsWithDeviceToken_deviceToken; - NSError *const error = ably.instanceStore.didFailToRegisterForRemoteNotificationsWithError_error; - if (apnsDeviceToken != nil) { - [ARTPush didRegisterForRemoteNotificationsWithDeviceToken:apnsDeviceToken realtime:realtime]; - } else if (error != nil) { - [ARTPush didFailToRegisterForRemoteNotificationsWithError:error realtime:realtime]; - } result(handle); }; @@ -801,7 +780,6 @@ -(void)reset { } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [[UIApplication sharedApplication] registerForRemoteNotifications]; // Check if application was launched from a notification tap. // https://stackoverflow.com/a/21611009/7365866 @@ -814,16 +792,35 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( } #pragma mark - Push Notifications Registration - UIApplicationDelegate -/// Save the deviceToken provided so we can pass it to the first Ably client which gets created, in createRealtime or createRest. --(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - // Set deviceToken on all existing Ably clients, and a property which used for all future Ably clients. - [_instanceStore didRegisterForRemoteNotificationsWithDeviceToken: deviceToken]; + +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + if (PushHandlers.pushActivatorHandle == nil) + return; + ARTRealtime *const realtime = [_instanceStore realtimeFrom:PushHandlers.pushActivatorHandle]; + if (realtime) { + [ARTPush didRegisterForRemoteNotificationsWithDeviceToken:deviceToken realtime:realtime]; + } + else { + ARTRest *const rest = [_instanceStore restFrom:PushHandlers.pushActivatorHandle]; + if (rest) { + [ARTPush didRegisterForRemoteNotificationsWithDeviceToken:deviceToken rest:rest]; + } + } } -/// Save the error if it occurred during APNs device registration provided so we can pass it to the first Ably client which gets created, in createRealtime or createRest. - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { - // This error will be used when the first Ably client is made. - _instanceStore.didFailToRegisterForRemoteNotificationsWithError_error = error; + if (PushHandlers.pushActivatorHandle == nil) + return; + ARTRealtime *const realtime = [_instanceStore realtimeFrom:PushHandlers.pushActivatorHandle]; + if (realtime) { + [ARTPush didFailToRegisterForRemoteNotificationsWithError:error realtime:realtime]; + } + else { + ARTRest *const rest = [_instanceStore restFrom:PushHandlers.pushActivatorHandle]; + if (rest) { + [ARTPush didFailToRegisterForRemoteNotificationsWithError:error rest:rest]; + } + } } - (BOOL)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { diff --git a/ios/Classes/AblyInstanceStore.h b/ios/Classes/AblyInstanceStore.h index 8af0edbc1..4567f2a83 100644 --- a/ios/Classes/AblyInstanceStore.h +++ b/ios/Classes/AblyInstanceStore.h @@ -25,12 +25,6 @@ NS_ASSUME_NONNULL_BEGIN -(ARTPaginatedResult *) getPaginatedResult:(NSNumber *const) handle; --(void) didRegisterForRemoteNotificationsWithDeviceToken:(NSData *const) deviceToken; - -@property(nonatomic, nullable) NSData * didRegisterForRemoteNotificationsWithDeviceToken_deviceToken; - -@property(nonatomic, nullable) NSError * didFailToRegisterForRemoteNotificationsWithError_error; - -(void)reset; @end diff --git a/ios/Classes/AblyInstanceStore.m b/ios/Classes/AblyInstanceStore.m index 7ef35ab4d..fbf97a812 100644 --- a/ios/Classes/AblyInstanceStore.m +++ b/ios/Classes/AblyInstanceStore.m @@ -65,20 +65,6 @@ -(ARTPaginatedResult *) getPaginatedResult:(NSNumber *const) handle { return _paginatedResults[handle]; } -// Set device token on all existing clients --(void) didRegisterForRemoteNotificationsWithDeviceToken:(NSData *const) deviceToken { - _didRegisterForRemoteNotificationsWithDeviceToken_deviceToken = deviceToken; - - for (id restHandle in _restInstances) { - ARTRest *const rest = _restInstances[restHandle]; - [ARTPush didRegisterForRemoteNotificationsWithDeviceToken:deviceToken rest:rest]; - } - for (id realtimeHandle in _realtimeInstances) { - ARTRealtime *const realtime = _realtimeInstances[realtimeHandle]; - [ARTPush didRegisterForRemoteNotificationsWithDeviceToken:deviceToken realtime:realtime]; - } -} - -(void)reset { for (ARTRealtime *const r in _realtimeInstances.allValues) { [r close]; diff --git a/ios/Classes/handlers/PushHandlers.swift b/ios/Classes/handlers/PushHandlers.swift index 7ffdc13ef..64e917266 100644 --- a/ios/Classes/handlers/PushHandlers.swift +++ b/ios/Classes/handlers/PushHandlers.swift @@ -2,12 +2,17 @@ import Foundation import UserNotifications public class PushHandlers: NSObject { + + @objc + public static var pushActivatorHandle: NSNumber? + @objc public static var pushNotificationTapLaunchedAppFromTerminatedData: Dictionary? = nil; @objc public static let activate: FlutterHandler = { ably, call, result in if let push = getPush(instanceStore: ably.instanceStore, call: call, result: result) { + pushActivatorHandle = (call.arguments as! AblyFlutterMessage).handle PushActivationEventHandlers.getInstance(methodChannel: ably.channel).flutterResultForActivate = result push.activate() } else { @@ -18,6 +23,7 @@ public class PushHandlers: NSObject { @objc public static let deactivate: FlutterHandler = { ably, call, result in if let push = getPush(instanceStore: ably.instanceStore, call: call, result: result) { + pushActivatorHandle = nil PushActivationEventHandlers.getInstance(methodChannel: ably.channel).flutterResultForDeactivate = result push.deactivate() } else {