Skip to content

Commit 86a2723

Browse files
authored
feat: support async callbacks for messages and notification taps (#252)
1 parent 6698bb9 commit 86a2723

File tree

6 files changed

+35
-29
lines changed

6 files changed

+35
-29
lines changed

packages/firebase-messaging-core/index.ios.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,14 @@ function deserialize(data: any): any {
4343

4444
export class MessagingCore implements IMessagingCore {
4545
_APNSToken;
46-
_onMessage(message: any) {
46+
_onMessage(message: any, completionHandler: () => void) {
4747
console.log('_onMessage', message);
4848
if (onMessageCallbacks.size > 0) {
4949
const msg = deserialize(message);
50-
onMessageCallbacks.forEach((cb) => {
51-
cb(msg);
52-
});
50+
Promise.all(Array.from(onMessageCallbacks).map((cb) => cb(msg))).finally(() => completionHandler());
5351
} else {
5452
MessagingCore._messageQueues._onMessage.push(message);
53+
completionHandler();
5554
}
5655
}
5756
_onToken(token: string) {
@@ -65,15 +64,14 @@ export class MessagingCore implements IMessagingCore {
6564
MessagingCore._messageQueues._onToken.push(token);
6665
}
6766
}
68-
_onNotificationTap(message: any) {
67+
_onNotificationTap(message: any, completionHandler: () => void) {
6968
console.log('_onNotificationTap', message);
7069
if (onNotificationTapCallbacks.size > 0) {
7170
const msg = deserialize(message);
72-
onNotificationTapCallbacks.forEach((cb) => {
73-
cb(msg);
74-
});
71+
Promise.all(Array.from(onNotificationTapCallbacks).map((cb) => cb(msg))).finally(() => completionHandler());
7572
} else {
7673
MessagingCore._messageQueues._onNotificationTap.push(message);
74+
completionHandler();
7775
}
7876
}
7977

@@ -336,7 +334,7 @@ export class MessagingCore implements IMessagingCore {
336334
if (queue.length > 0) {
337335
MessagingCore._messageQueues[type] = [];
338336
queue.forEach((message) => {
339-
this[type](message);
337+
this[type](message, () => {});
340338
});
341339
}
342340
}

packages/firebase-messaging-core/platforms/ios/src/NSCFirebaseMessagingCore.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#import <UIKit/UIKit.h>
33

44
typedef void(^BoolCallback)(BOOL success, NSError* _Nullable error);
5-
typedef void(^DictionaryCallback)(NSDictionary* _Nullable value);
5+
typedef void(^CompletableDictionaryCallback)(NSDictionary* _Nullable value, void(^_Nonnull complete)(void));
66
typedef void(^StringCallback)(NSString* _Nullable value);
77

88
@interface NSCFirebaseMessagingCore: NSObject
@@ -11,9 +11,9 @@ typedef void(^StringCallback)(NSString* _Nullable value);
1111

1212
@property (nonatomic, strong, class) BoolCallback _Nullable registerDeviceForRemoteMessagesCallback;
1313

14-
@property (nonatomic, strong, class) DictionaryCallback _Nullable onNotificationTapCallback;
14+
@property (nonatomic, strong, class) CompletableDictionaryCallback _Nullable onNotificationTapCallback;
1515

16-
@property (nonatomic, strong, class) DictionaryCallback _Nullable onMessageCallback;
16+
@property (nonatomic, strong, class) CompletableDictionaryCallback _Nullable onMessageCallback;
1717

1818
@property (nonatomic, strong, class) StringCallback _Nullable onTokenCallback;
1919

packages/firebase-messaging-core/platforms/ios/src/NSCFirebaseMessagingCore.m

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ @implementation NSCFirebaseMessagingCore
33

44
BOOL ShowNotificationsWhenInForeground = NO;
55
BoolCallback RegisterDeviceForRemoteMessagesCallback = nil;
6-
DictionaryCallback OnNotificationTapCallback = nil;
7-
DictionaryCallback OnMessageCallback = nil;
6+
CompletableDictionaryCallback OnNotificationTapCallback = nil;
7+
CompletableDictionaryCallback OnMessageCallback = nil;
88
StringCallback OnTokenCallback = nil;
99

1010
+ (void)setShowNotificationsWhenInForeground:(BOOL)showNotificationsWhenInForeground {
@@ -23,19 +23,19 @@ + (void)setRegisterDeviceForRemoteMessagesCallback:(BoolCallback)callback {
2323
RegisterDeviceForRemoteMessagesCallback = callback;
2424
}
2525

26-
+ (DictionaryCallback)onNotificationTapCallback {
26+
+ (CompletableDictionaryCallback)onNotificationTapCallback {
2727
return OnNotificationTapCallback;
2828
}
2929

30-
+ (void)setOnNotificationTapCallback:(DictionaryCallback)callback {
30+
+ (void)setOnNotificationTapCallback:(CompletableDictionaryCallback)callback {
3131
OnNotificationTapCallback = callback;
3232
}
3333

34-
+ (DictionaryCallback)onMessageCallback {
34+
+ (CompletableDictionaryCallback)onMessageCallback {
3535
return OnMessageCallback;
3636
}
3737

38-
+ (void)setOnMessageCallback:(DictionaryCallback)callback {
38+
+ (void)setOnMessageCallback:(CompletableDictionaryCallback)callback {
3939
OnMessageCallback = callback;
4040
}
4141

packages/firebase-messaging-core/platforms/ios/src/NSCUIApplicationDelegate.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ public class NSCUIApplicationDelegate: UIResponder , UIApplicationDelegate {
149149
message = parseRemoteMessage(userInfo)
150150
#endif
151151
message["foreground"] = application.applicationState == UIApplication.State.active
152-
NSCFirebaseMessagingCore.onMessageCallback?(message)
153-
completionHandler(.newData)
154-
152+
NSCFirebaseMessagingCore.onMessageCallback?(message) {
153+
completionHandler(.newData)
154+
}
155155
}
156156

157157
}

packages/firebase-messaging-core/platforms/ios/src/NSCUNUserNotificationCenterDelegate.swift

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,16 @@ public class NSCUNUserNotificationCenterDelegate: NSObject, UNUserNotificationCe
5353
if (remoteNotification["gcm.message_id"] != nil) {
5454
var message = parseNotification(response.notification)
5555
message["foreground"] = UIApplication.shared.applicationState == UIApplication.State.active
56-
NSCFirebaseMessagingCore.onNotificationTapCallback?(message)
56+
NSCFirebaseMessagingCore.onNotificationTapCallback?(message) {
57+
completionHandler()
58+
}
5759
}else {
5860
if((response.notification.request.trigger as? UNPushNotificationTrigger) != nil){
5961
var message = remoteNotification
6062
message["foreground"] = UIApplication.shared.applicationState == UIApplication.State.active
61-
NSCFirebaseMessagingCore.onNotificationTapCallback?(message)
63+
NSCFirebaseMessagingCore.onNotificationTapCallback?(message) {
64+
completionHandler()
65+
}
6266
}
6367
}
6468

@@ -82,18 +86,22 @@ public class NSCUNUserNotificationCenterDelegate: NSObject, UNUserNotificationCe
8286
if (notification.request.content.userInfo["gcm.message_id"] != nil) {
8387
var message = parseNotification(notification)
8488
if (message["contentAvailable"] == nil) {
85-
NSCFirebaseMessagingCore.onMessageCallback?(message)
89+
NSCFirebaseMessagingCore.onMessageCallback?(message) {
90+
completionHandler(options)
91+
}
8692
message["foreground"] = UIApplication.shared.applicationState == UIApplication.State.active
93+
} else {
94+
completionHandler(options)
8795
}
88-
completionHandler(options)
8996
return
9097
}else {
9198
if((notification.request.trigger as? UNPushNotificationTrigger) != nil){
9299

93100
var message = notification.request.content.userInfo
94101
message["foreground"] = UIApplication.shared.applicationState == UIApplication.State.active
95-
NSCFirebaseMessagingCore.onMessageCallback?(message)
96-
completionHandler(options)
102+
NSCFirebaseMessagingCore.onMessageCallback?(message) {
103+
completionHandler(options)
104+
}
97105
return
98106
}
99107
}

packages/firebase-messaging/typings/objc!NSCFirebaseMessagingCore.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ declare class NSCFirebaseMessagingCore extends NSObject {
55

66
static new(): NSCFirebaseMessagingCore; // inherited from NSObject
77

8-
static onMessageCallback: (p1: NSDictionary<any, any>) => void;
8+
static onMessageCallback: (p1: NSDictionary<any, any>, p2: () => void) => void;
99

10-
static onNotificationTapCallback: (p1: NSDictionary<any, any>) => void;
10+
static onNotificationTapCallback: (p1: NSDictionary<any, any>, p2: () => void) => void;
1111

1212
static onTokenCallback: (p1: string) => void;
1313

0 commit comments

Comments
 (0)