[messaging][notifications] Move all notifications from messaging to notifications
This commit is contained in:
parent
a244f17853
commit
831eec82f7
|
@ -15,8 +15,6 @@
|
||||||
@property _Nullable RCTPromiseResolveBlock permissionResolver;
|
@property _Nullable RCTPromiseResolveBlock permissionResolver;
|
||||||
|
|
||||||
#if !TARGET_OS_TV
|
#if !TARGET_OS_TV
|
||||||
- (void)didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo;
|
|
||||||
- (void)didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(void (^_Nonnull)(UIBackgroundFetchResult))completionHandler;
|
|
||||||
- (void)didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings;
|
- (void)didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -11,14 +11,10 @@
|
||||||
#import <React/RCTConvert.h>
|
#import <React/RCTConvert.h>
|
||||||
#import <React/RCTUtils.h>
|
#import <React/RCTUtils.h>
|
||||||
|
|
||||||
// For iOS 10 we need to implement UNUserNotificationCenterDelegate to receive display
|
|
||||||
// notifications via APNS
|
|
||||||
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
@import UserNotifications;
|
@import UserNotifications;
|
||||||
@interface RNFirebaseMessaging () <UNUserNotificationCenterDelegate>
|
|
||||||
#else
|
|
||||||
@interface RNFirebaseMessaging ()
|
|
||||||
#endif
|
#endif
|
||||||
|
@interface RNFirebaseMessaging ()
|
||||||
@property (nonatomic, strong) NSMutableDictionary *callbackHandlers;
|
@property (nonatomic, strong) NSMutableDictionary *callbackHandlers;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@ -49,11 +45,6 @@ RCT_EXPORT_MODULE()
|
||||||
// Establish Firebase managed data channel
|
// Establish Firebase managed data channel
|
||||||
[FIRMessaging messaging].shouldEstablishDirectChannel = YES;
|
[FIRMessaging messaging].shouldEstablishDirectChannel = YES;
|
||||||
|
|
||||||
// If we're on iOS 10 then we need to set this as a delegate for the UNUserNotificationCenter
|
|
||||||
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
|
||||||
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Set static instance for use from AppDelegate
|
// Set static instance for use from AppDelegate
|
||||||
theRNFirebaseMessaging = self;
|
theRNFirebaseMessaging = self;
|
||||||
|
|
||||||
|
@ -66,25 +57,6 @@ RCT_EXPORT_MODULE()
|
||||||
// ** iOS 8/9 Only
|
// ** iOS 8/9 Only
|
||||||
// *******************************************************
|
// *******************************************************
|
||||||
|
|
||||||
// Listen for background messages
|
|
||||||
- (void)didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo {
|
|
||||||
BOOL isFromBackground = (RCTSharedApplication().applicationState == UIApplicationStateInactive);
|
|
||||||
NSDictionary *message = [self parseUserInfo:userInfo messageType:@"RemoteNotification" clickAction:nil openedFromTray:isFromBackground];
|
|
||||||
|
|
||||||
[RNFirebaseUtil sendJSEvent:self name:MESSAGING_MESSAGE_RECEIVED body:message];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Listen for background messages
|
|
||||||
- (void)didReceiveRemoteNotification:(NSDictionary *)userInfo
|
|
||||||
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
|
|
||||||
BOOL isFromBackground = (RCTSharedApplication().applicationState == UIApplicationStateInactive);
|
|
||||||
NSDictionary *message = [self parseUserInfo:userInfo messageType:@"RemoteNotificationHandler" clickAction:nil openedFromTray:isFromBackground];
|
|
||||||
|
|
||||||
[_callbackHandlers setObject:[completionHandler copy] forKey:message[@"messageId"]];
|
|
||||||
|
|
||||||
[RNFirebaseUtil sendJSEvent:self name:MESSAGING_MESSAGE_RECEIVED body:message];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Listen for permission response
|
// Listen for permission response
|
||||||
- (void) didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
|
- (void) didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
|
||||||
if (notificationSettings.types == UIUserNotificationTypeNone) {
|
if (notificationSettings.types == UIUserNotificationTypeNone) {
|
||||||
|
@ -103,68 +75,6 @@ RCT_EXPORT_MODULE()
|
||||||
// *******************************************************
|
// *******************************************************
|
||||||
|
|
||||||
|
|
||||||
// *******************************************************
|
|
||||||
// ** Start UNUserNotificationCenterDelegate methods
|
|
||||||
// ** iOS 10+
|
|
||||||
// *******************************************************
|
|
||||||
|
|
||||||
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
|
||||||
// Handle incoming notification messages while app is in the foreground.
|
|
||||||
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
|
|
||||||
willPresentNotification:(UNNotification *)notification
|
|
||||||
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
|
|
||||||
|
|
||||||
NSString *event;
|
|
||||||
UNNotificationPresentationOptions options;
|
|
||||||
NSDictionary *message = [self parseUNNotification:notification messageType:@"PresentNotification" openedFromTray:false];
|
|
||||||
|
|
||||||
if (isFCM || isScheduled) {
|
|
||||||
// If app is in the background
|
|
||||||
if (RCTSharedApplication().applicationState == UIApplicationStateInactive) {
|
|
||||||
// display the notification
|
|
||||||
options = UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound;
|
|
||||||
// notification_displayed
|
|
||||||
event = NOTIFICATIONS_NOTIFICATION_DISPLAYED;
|
|
||||||
} else {
|
|
||||||
// don't show notification
|
|
||||||
options = UNNotificationPresentationOptionNone;
|
|
||||||
// notification_received
|
|
||||||
event = NOTIFICATIONS_NOTIFICATION_RECEIVED;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Triggered by `notifications().displayNotification(notification)`
|
|
||||||
// Display the notification
|
|
||||||
options = UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound;
|
|
||||||
// no event
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
[RNFirebaseUtil sendJSEvent:self name:event body:message];
|
|
||||||
}
|
|
||||||
completionHandler(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle notification messages after display notification is tapped by the user.
|
|
||||||
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
|
|
||||||
didReceiveNotificationResponse:(UNNotificationResponse *)response
|
|
||||||
#if defined(__IPHONE_11_0)
|
|
||||||
withCompletionHandler:(void(^)(void))completionHandler {
|
|
||||||
#else
|
|
||||||
withCompletionHandler:(void(^)())completionHandler {
|
|
||||||
#endif
|
|
||||||
NSDictionary *message = [self parseUNNotification:response.notification messageType:@"NotificationResponse" openedFromTray:true];
|
|
||||||
|
|
||||||
[RNFirebaseUtil sendJSEvent:self name:NOTIFICATIONS_NOTIFICATION_CLICKED body:message];
|
|
||||||
completionHandler();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// *******************************************************
|
|
||||||
// ** Finish UNUserNotificationCenterDelegate methods
|
|
||||||
// *******************************************************
|
|
||||||
|
|
||||||
|
|
||||||
// *******************************************************
|
// *******************************************************
|
||||||
// ** Start FIRMessagingDelegate methods
|
// ** Start FIRMessagingDelegate methods
|
||||||
// ** iOS 8+
|
// ** iOS 8+
|
||||||
|
@ -228,20 +138,16 @@ RCT_EXPORT_METHOD(requestPermission:(RCTPromiseResolveBlock)resolve rejecter:(RC
|
||||||
|
|
||||||
// Non Web SDK methods
|
// Non Web SDK methods
|
||||||
|
|
||||||
|
// TODO: Move to notifications
|
||||||
RCT_EXPORT_METHOD(getBadge: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
|
RCT_EXPORT_METHOD(getBadge: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
resolve(@([RCTSharedApplication() applicationIconBadgeNumber]));
|
resolve(@([RCTSharedApplication() applicationIconBadgeNumber]));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Remove
|
||||||
RCT_EXPORT_METHOD(getInitialMessage:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject){
|
RCT_EXPORT_METHOD(getInitialMessage:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject){
|
||||||
NSDictionary *notification = [self bridge].launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
|
resolve(nil);
|
||||||
if (notification) {
|
|
||||||
NSDictionary *message = [self parseUserInfo:notification messageType:@"InitialMessage" clickAction:nil openedFromTray:true];
|
|
||||||
resolve(message);
|
|
||||||
} else {
|
|
||||||
resolve(nil);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RCT_EXPORT_METHOD(hasPermission: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
|
RCT_EXPORT_METHOD(hasPermission: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
|
||||||
|
@ -273,6 +179,7 @@ RCT_EXPORT_METHOD(sendMessage: (NSDictionary *) message
|
||||||
[[FIRMessaging messaging] sendMessage:data to:to withMessageID:messageId timeToLive:[ttl intValue]];
|
[[FIRMessaging messaging] sendMessage:data to:to withMessageID:messageId timeToLive:[ttl intValue]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Move to notifications
|
||||||
RCT_EXPORT_METHOD(setBadge: (NSInteger) number) {
|
RCT_EXPORT_METHOD(setBadge: (NSInteger) number) {
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
[RCTSharedApplication() setApplicationIconBadgeNumber:number];
|
[RCTSharedApplication() setApplicationIconBadgeNumber:number];
|
||||||
|
@ -395,95 +302,8 @@ RCT_EXPORT_METHOD(completeRemoteNotification: (NSString*) messageId
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSDictionary*)parseUNNotification:(UNNotification *)notification
|
|
||||||
messageType:(NSString *)messageType
|
|
||||||
openedFromTray:(bool)openedFromTray {
|
|
||||||
NSDictionary *userInfo = notification.request.content.userInfo;
|
|
||||||
NSString *clickAction = notification.request.content.categoryIdentifier;
|
|
||||||
|
|
||||||
return [self parseUserInfo:userInfo messageType:messageType clickAction:clickAction openedFromTray:openedFromTray];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSDictionary*)parseUserInfo:(NSDictionary *)userInfo
|
|
||||||
messageType:(NSString *) messageType
|
|
||||||
clickAction:(NSString *) clickAction
|
|
||||||
openedFromTray:(bool)openedFromTray {
|
|
||||||
NSMutableDictionary *message = [[NSMutableDictionary alloc] init];
|
|
||||||
NSMutableDictionary *notif = [[NSMutableDictionary alloc] init];
|
|
||||||
NSMutableDictionary *data = [[NSMutableDictionary alloc] init];
|
|
||||||
|
|
||||||
for (id k1 in userInfo) {
|
|
||||||
if ([k1 isEqualToString:@"aps"]) {
|
|
||||||
NSDictionary *aps = userInfo[k1];
|
|
||||||
for (id k2 in aps) {
|
|
||||||
if ([k2 isEqualToString:@"alert"]) {
|
|
||||||
NSDictionary *alert = aps[k2];
|
|
||||||
for (id k3 in alert) {
|
|
||||||
if ([k3 isEqualToString:@"body"]) {
|
|
||||||
notif[@"body"] = alert[k3];
|
|
||||||
} else if ([k3 isEqualToString:@"loc-args"]) {
|
|
||||||
notif[@"bodyLocalizationArgs"] = alert[k3];
|
|
||||||
} else if ([k3 isEqualToString:@"loc-key"]) {
|
|
||||||
notif[@"bodyLocalizationKey"] = alert[k3];
|
|
||||||
} else if ([k3 isEqualToString:@"subtitle"]) {
|
|
||||||
notif[@"subtitle"] = alert[k3];
|
|
||||||
} else if ([k3 isEqualToString:@"title"]) {
|
|
||||||
notif[@"title"] = alert[k3];
|
|
||||||
} else if ([k3 isEqualToString:@"title-loc-args"]) {
|
|
||||||
notif[@"titleLocalizationArgs"] = alert[k3];
|
|
||||||
} else if ([k3 isEqualToString:@"title-loc-key"]) {
|
|
||||||
notif[@"titleLocalizationKey"] = alert[k3];
|
|
||||||
} else {
|
|
||||||
NSLog(@"Unknown alert key: %@", k2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ([k2 isEqualToString:@"badge"]) {
|
|
||||||
notif[@"badge"] = aps[k2];
|
|
||||||
} else if ([k2 isEqualToString:@"category"]) {
|
|
||||||
notif[@"clickAction"] = aps[k2];
|
|
||||||
} else if ([k2 isEqualToString:@"sound"]) {
|
|
||||||
notif[@"sound"] = aps[k2];
|
|
||||||
} else {
|
|
||||||
NSLog(@"Unknown aps key: %@", k2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ([k1 isEqualToString:@"gcm.message_id"]) {
|
|
||||||
message[@"messageId"] = userInfo[k1];
|
|
||||||
} else if ([k1 isEqualToString:@"google.c.a.ts"]) {
|
|
||||||
message[@"sentTime"] = userInfo[k1];
|
|
||||||
} else if ([k1 isEqualToString:@"gcm.n.e"]
|
|
||||||
|| [k1 isEqualToString:@"gcm.notification.sound2"]
|
|
||||||
|| [k1 isEqualToString:@"google.c.a.c_id"]
|
|
||||||
|| [k1 isEqualToString:@"google.c.a.c_l"]
|
|
||||||
|| [k1 isEqualToString:@"google.c.a.e"]
|
|
||||||
|| [k1 isEqualToString:@"google.c.a.udt"]) {
|
|
||||||
// Ignore known keys
|
|
||||||
} else {
|
|
||||||
// Assume custom data
|
|
||||||
data[k1] = userInfo[k1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!notif[@"clickAction"] && clickAction) {
|
|
||||||
notif[@"clickAction"] = clickAction;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate a message ID if one was not present in the notification
|
|
||||||
// This is used for resolving click handlers
|
|
||||||
if (!message[@"messageId"]) {
|
|
||||||
message[@"messageId"] = [[NSUUID UUID] UUIDString];
|
|
||||||
}
|
|
||||||
message[@"messageType"] = messageType;
|
|
||||||
|
|
||||||
message[@"data"] = data;
|
|
||||||
message[@"notification"] = notif;
|
|
||||||
message[@"openedFromTray"] = @(openedFromTray);
|
|
||||||
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSArray<NSString *> *)supportedEvents {
|
- (NSArray<NSString *> *)supportedEvents {
|
||||||
return @[MESSAGING_MESSAGE_RECEIVED, MESSAGING_TOKEN_REFRESHED, NOTIFICATIONS_NOTIFICATION_CLICKED, NOTIFICATIONS_NOTIFICATION_DISPLAYED, NOTIFICATIONS_NOTIFICATION_RECEIVED];
|
return @[MESSAGING_MESSAGE_RECEIVED, MESSAGING_TOKEN_REFRESHED];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (BOOL)requiresMainQueueSetup
|
+ (BOOL)requiresMainQueueSetup
|
||||||
|
@ -497,3 +317,4 @@ RCT_EXPORT_METHOD(completeRemoteNotification: (NSString*) messageId
|
||||||
@implementation RNFirebaseMessaging
|
@implementation RNFirebaseMessaging
|
||||||
@end
|
@end
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,12 @@
|
||||||
|
|
||||||
@interface RNFirebaseNotifications : RCTEventEmitter<RCTBridgeModule>
|
@interface RNFirebaseNotifications : RCTEventEmitter<RCTBridgeModule>
|
||||||
|
|
||||||
#if !TARGET_OS_TV
|
+ (_Nonnull instancetype)instance;
|
||||||
|
|
||||||
|
#if !TARGET_OS_TV
|
||||||
|
- (void)didReceiveLocalNotification:(nonnull UILocalNotification *)notification;
|
||||||
|
- (void)didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo;
|
||||||
|
- (void)didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(void (^_Nonnull)(UIBackgroundFetchResult))completionHandler;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -2,15 +2,146 @@
|
||||||
|
|
||||||
#if __has_include(<FirebaseMessaging/FIRMessaging.h>)
|
#if __has_include(<FirebaseMessaging/FIRMessaging.h>)
|
||||||
#import "RNFirebaseEvents.h"
|
#import "RNFirebaseEvents.h"
|
||||||
|
#import "RNFirebaseUtil.h"
|
||||||
#import <React/RCTUtils.h>
|
#import <React/RCTUtils.h>
|
||||||
|
|
||||||
|
// For iOS 10 we need to implement UNUserNotificationCenterDelegate to receive display
|
||||||
|
// notifications via APNS
|
||||||
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
@import UserNotifications;
|
@import UserNotifications;
|
||||||
|
@interface RNFirebaseNotifications () <UNUserNotificationCenterDelegate>
|
||||||
|
#else
|
||||||
|
@interface RNFirebaseNotifications ()
|
||||||
#endif
|
#endif
|
||||||
|
@end
|
||||||
|
|
||||||
@implementation RNFirebaseNotifications
|
@implementation RNFirebaseNotifications
|
||||||
|
|
||||||
|
static RNFirebaseNotifications *theRNFirebaseNotifications = nil;
|
||||||
|
|
||||||
|
+ (nonnull instancetype)instance {
|
||||||
|
return theRNFirebaseNotifications;
|
||||||
|
}
|
||||||
|
|
||||||
RCT_EXPORT_MODULE();
|
RCT_EXPORT_MODULE();
|
||||||
|
|
||||||
|
- (id)init {
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
NSLog(@"Setting up RNFirebaseNotifications instance");
|
||||||
|
[self configure];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)configure {
|
||||||
|
// If we're on iOS 10 then we need to set this as a delegate for the UNUserNotificationCenter
|
||||||
|
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Set static instance for use from AppDelegate
|
||||||
|
theRNFirebaseNotifications = self;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *******************************************************
|
||||||
|
// ** Start AppDelegate methods
|
||||||
|
// ** iOS 8/9 Only
|
||||||
|
// *******************************************************
|
||||||
|
|
||||||
|
- (void)didReceiveLocalNotification:(nonnull UILocalNotification *)notification {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen for background messages
|
||||||
|
- (void)didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo {
|
||||||
|
BOOL isFromBackground = (RCTSharedApplication().applicationState == UIApplicationStateInactive);
|
||||||
|
NSDictionary *message = [self parseUserInfo:userInfo messageType:@"RemoteNotification" clickAction:nil openedFromTray:isFromBackground];
|
||||||
|
|
||||||
|
[RNFirebaseUtil sendJSEvent:self name:MESSAGING_MESSAGE_RECEIVED body:message];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen for background messages
|
||||||
|
- (void)didReceiveRemoteNotification:(NSDictionary *)userInfo
|
||||||
|
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
|
||||||
|
BOOL isFromBackground = (RCTSharedApplication().applicationState == UIApplicationStateInactive);
|
||||||
|
NSDictionary *message = [self parseUserInfo:userInfo messageType:@"RemoteNotificationHandler" clickAction:nil openedFromTray:isFromBackground];
|
||||||
|
|
||||||
|
// [_callbackHandlers setObject:[completionHandler copy] forKey:message[@"messageId"]];
|
||||||
|
|
||||||
|
[RNFirebaseUtil sendJSEvent:self name:MESSAGING_MESSAGE_RECEIVED body:message];
|
||||||
|
}
|
||||||
|
|
||||||
|
// *******************************************************
|
||||||
|
// ** Finish AppDelegate methods
|
||||||
|
// *******************************************************
|
||||||
|
|
||||||
|
// *******************************************************
|
||||||
|
// ** Start UNUserNotificationCenterDelegate methods
|
||||||
|
// ** iOS 10+
|
||||||
|
// *******************************************************
|
||||||
|
|
||||||
|
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
// Handle incoming notification messages while app is in the foreground.
|
||||||
|
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
|
||||||
|
willPresentNotification:(UNNotification *)notification
|
||||||
|
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
|
||||||
|
|
||||||
|
UNNotificationTrigger *trigger = notification.request.trigger;
|
||||||
|
BOOL isFcm = trigger && [notification.request.trigger class] == [UNPushNotificationTrigger class];
|
||||||
|
BOOL isScheduled = trigger && [notification.request.trigger class] == [UNCalendarNotificationTrigger class];
|
||||||
|
|
||||||
|
NSString *event;
|
||||||
|
UNNotificationPresentationOptions options;
|
||||||
|
NSDictionary *message = [self parseUNNotification:notification messageType:@"PresentNotification" openedFromTray:false];
|
||||||
|
|
||||||
|
if (isFcm || isScheduled) {
|
||||||
|
// If app is in the background
|
||||||
|
if (RCTSharedApplication().applicationState == UIApplicationStateInactive) {
|
||||||
|
// display the notification
|
||||||
|
options = UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound;
|
||||||
|
// notification_displayed
|
||||||
|
event = NOTIFICATIONS_NOTIFICATION_DISPLAYED;
|
||||||
|
} else {
|
||||||
|
// don't show notification
|
||||||
|
options = UNNotificationPresentationOptionNone;
|
||||||
|
// notification_received
|
||||||
|
event = NOTIFICATIONS_NOTIFICATION_RECEIVED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Triggered by `notifications().displayNotification(notification)`
|
||||||
|
// Display the notification
|
||||||
|
options = UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound;
|
||||||
|
// notification_displayed
|
||||||
|
event = NOTIFICATIONS_NOTIFICATION_DISPLAYED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
[RNFirebaseUtil sendJSEvent:self name:event body:message];
|
||||||
|
}
|
||||||
|
completionHandler(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle notification messages after display notification is tapped by the user.
|
||||||
|
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
|
||||||
|
didReceiveNotificationResponse:(UNNotificationResponse *)response
|
||||||
|
#if defined(__IPHONE_11_0)
|
||||||
|
withCompletionHandler:(void(^)(void))completionHandler {
|
||||||
|
#else
|
||||||
|
withCompletionHandler:(void(^)())completionHandler {
|
||||||
|
#endif
|
||||||
|
NSDictionary *message = [self parseUNNotification:response.notification messageType:@"NotificationResponse" openedFromTray:true];
|
||||||
|
|
||||||
|
[RNFirebaseUtil sendJSEvent:self name:NOTIFICATIONS_NOTIFICATION_CLICKED body:message];
|
||||||
|
completionHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// *******************************************************
|
||||||
|
// ** Finish UNUserNotificationCenterDelegate methods
|
||||||
|
// *******************************************************
|
||||||
|
|
||||||
RCT_EXPORT_METHOD(cancelAllNotifications) {
|
RCT_EXPORT_METHOD(cancelAllNotifications) {
|
||||||
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
|
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
|
||||||
[RCTSharedApplication() cancelAllLocalNotifications];
|
[RCTSharedApplication() cancelAllLocalNotifications];
|
||||||
|
@ -372,8 +503,95 @@ RCT_EXPORT_METHOD(scheduleNotification:(NSDictionary*) notification
|
||||||
return notification;
|
return notification;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSDictionary*)parseUNNotification:(UNNotification *)notification
|
||||||
|
messageType:(NSString *)messageType
|
||||||
|
openedFromTray:(bool)openedFromTray {
|
||||||
|
NSDictionary *userInfo = notification.request.content.userInfo;
|
||||||
|
NSString *clickAction = notification.request.content.categoryIdentifier;
|
||||||
|
|
||||||
|
return [self parseUserInfo:userInfo messageType:messageType clickAction:clickAction openedFromTray:openedFromTray];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary*)parseUserInfo:(NSDictionary *)userInfo
|
||||||
|
messageType:(NSString *) messageType
|
||||||
|
clickAction:(NSString *) clickAction
|
||||||
|
openedFromTray:(bool)openedFromTray {
|
||||||
|
NSMutableDictionary *message = [[NSMutableDictionary alloc] init];
|
||||||
|
NSMutableDictionary *notif = [[NSMutableDictionary alloc] init];
|
||||||
|
NSMutableDictionary *data = [[NSMutableDictionary alloc] init];
|
||||||
|
|
||||||
|
for (id k1 in userInfo) {
|
||||||
|
if ([k1 isEqualToString:@"aps"]) {
|
||||||
|
NSDictionary *aps = userInfo[k1];
|
||||||
|
for (id k2 in aps) {
|
||||||
|
if ([k2 isEqualToString:@"alert"]) {
|
||||||
|
NSDictionary *alert = aps[k2];
|
||||||
|
for (id k3 in alert) {
|
||||||
|
if ([k3 isEqualToString:@"body"]) {
|
||||||
|
notif[@"body"] = alert[k3];
|
||||||
|
} else if ([k3 isEqualToString:@"loc-args"]) {
|
||||||
|
notif[@"bodyLocalizationArgs"] = alert[k3];
|
||||||
|
} else if ([k3 isEqualToString:@"loc-key"]) {
|
||||||
|
notif[@"bodyLocalizationKey"] = alert[k3];
|
||||||
|
} else if ([k3 isEqualToString:@"subtitle"]) {
|
||||||
|
notif[@"subtitle"] = alert[k3];
|
||||||
|
} else if ([k3 isEqualToString:@"title"]) {
|
||||||
|
notif[@"title"] = alert[k3];
|
||||||
|
} else if ([k3 isEqualToString:@"title-loc-args"]) {
|
||||||
|
notif[@"titleLocalizationArgs"] = alert[k3];
|
||||||
|
} else if ([k3 isEqualToString:@"title-loc-key"]) {
|
||||||
|
notif[@"titleLocalizationKey"] = alert[k3];
|
||||||
|
} else {
|
||||||
|
NSLog(@"Unknown alert key: %@", k2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ([k2 isEqualToString:@"badge"]) {
|
||||||
|
notif[@"badge"] = aps[k2];
|
||||||
|
} else if ([k2 isEqualToString:@"category"]) {
|
||||||
|
notif[@"clickAction"] = aps[k2];
|
||||||
|
} else if ([k2 isEqualToString:@"sound"]) {
|
||||||
|
notif[@"sound"] = aps[k2];
|
||||||
|
} else {
|
||||||
|
NSLog(@"Unknown aps key: %@", k2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ([k1 isEqualToString:@"gcm.message_id"]) {
|
||||||
|
message[@"messageId"] = userInfo[k1];
|
||||||
|
} else if ([k1 isEqualToString:@"google.c.a.ts"]) {
|
||||||
|
message[@"sentTime"] = userInfo[k1];
|
||||||
|
} else if ([k1 isEqualToString:@"gcm.n.e"]
|
||||||
|
|| [k1 isEqualToString:@"gcm.notification.sound2"]
|
||||||
|
|| [k1 isEqualToString:@"google.c.a.c_id"]
|
||||||
|
|| [k1 isEqualToString:@"google.c.a.c_l"]
|
||||||
|
|| [k1 isEqualToString:@"google.c.a.e"]
|
||||||
|
|| [k1 isEqualToString:@"google.c.a.udt"]) {
|
||||||
|
// Ignore known keys
|
||||||
|
} else {
|
||||||
|
// Assume custom data
|
||||||
|
data[k1] = userInfo[k1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!notif[@"clickAction"] && clickAction) {
|
||||||
|
notif[@"clickAction"] = clickAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate a message ID if one was not present in the notification
|
||||||
|
// This is used for resolving click handlers
|
||||||
|
if (!message[@"messageId"]) {
|
||||||
|
message[@"messageId"] = [[NSUUID UUID] UUIDString];
|
||||||
|
}
|
||||||
|
message[@"messageType"] = messageType;
|
||||||
|
|
||||||
|
message[@"data"] = data;
|
||||||
|
message[@"notification"] = notif;
|
||||||
|
message[@"openedFromTray"] = @(openedFromTray);
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
- (NSArray<NSString *> *)supportedEvents {
|
- (NSArray<NSString *> *)supportedEvents {
|
||||||
return @[NOTIFICATIONS_NOTIFICATION_RECEIVED];
|
return @[NOTIFICATIONS_NOTIFICATION_CLICKED, NOTIFICATIONS_NOTIFICATION_DISPLAYED, NOTIFICATIONS_NOTIFICATION_RECEIVED];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (BOOL)requiresMainQueueSetup
|
+ (BOOL)requiresMainQueueSetup
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#import <React/RCTBundleURLProvider.h>
|
#import <React/RCTBundleURLProvider.h>
|
||||||
#import <React/RCTRootView.h>
|
#import <React/RCTRootView.h>
|
||||||
#import <Firebase.h>
|
#import <Firebase.h>
|
||||||
#import <RNFirebaseMessaging.h>
|
#import <RNFirebaseNotifications.h>
|
||||||
|
|
||||||
@implementation AppDelegate
|
@implementation AppDelegate
|
||||||
|
|
||||||
|
@ -39,12 +39,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
|
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
|
||||||
[[RNFirebaseMessaging instance] didReceiveRemoteNotification:userInfo];
|
[[RNFirebaseNotifications instance] didReceiveRemoteNotification:userInfo];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
|
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
|
||||||
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
|
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
|
||||||
[[RNFirebaseMessaging instance] didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
|
[[RNFirebaseNotifications instance] didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
Loading…
Reference in New Issue