diff --git a/src/Plugin.FirebasePushNotification.Android/FirebasePushNotificationManager.cs b/src/Plugin.FirebasePushNotification.Android/FirebasePushNotificationManager.cs index 748c207..22ea9d7 100644 --- a/src/Plugin.FirebasePushNotification.Android/FirebasePushNotificationManager.cs +++ b/src/Plugin.FirebasePushNotification.Android/FirebasePushNotificationManager.cs @@ -313,7 +313,17 @@ public event FirebasePushNotificationTokenEventHandler OnTokenRefresh { add { + var previous = _onTokenRefresh; _onTokenRefresh += value; + + if (previous == null) + { + var token = Token; + if (!string.IsNullOrEmpty(token)) + { + _onTokenRefresh?.Invoke(this, new FirebasePushNotificationTokenEventArgs(Token)); + } + } } remove { diff --git a/src/Plugin.FirebasePushNotification.iOS/FirebasePushNotificationManager.cs b/src/Plugin.FirebasePushNotification.iOS/FirebasePushNotificationManager.cs index d43fbab..70cc6b6 100644 --- a/src/Plugin.FirebasePushNotification.iOS/FirebasePushNotificationManager.cs +++ b/src/Plugin.FirebasePushNotification.iOS/FirebasePushNotificationManager.cs @@ -20,6 +20,8 @@ namespace Plugin.FirebasePushNotification public class FirebasePushNotificationManager : NSObject, IFirebasePushNotification, IUNUserNotificationCenterDelegate, IMessagingDelegate { public static UNNotificationPresentationOptions CurrentNotificationPresentationOption { get; set; } = UNNotificationPresentationOptions.None; + private static bool EnableDelayedResponse; + static NotificationResponse delayedNotificationResponse = null; static NSObject messagingConnectionChangeNotificationToken; static Queue> pendingTopics = new Queue>(); static bool connected = false; @@ -36,7 +38,17 @@ public event FirebasePushNotificationTokenEventHandler OnTokenRefresh { add { + var previous = _onTokenRefresh; _onTokenRefresh += value; + + if (EnableDelayedResponse && previous == null) + { + var token = Token; + if (!string.IsNullOrEmpty(token)) + { + _onTokenRefresh?.Invoke(this, new FirebasePushNotificationTokenEventArgs(Token)); + } + } } remove { @@ -75,7 +87,15 @@ public event FirebasePushNotificationResponseEventHandler OnNotificationOpened { add { + var previousVal = _onNotificationOpened; _onNotificationOpened += value; + if (delayedNotificationResponse != null && previousVal == null) + { + var tmpParams = delayedNotificationResponse; + _onNotificationOpened?.Invoke(CrossFirebasePushNotification.Current, new FirebasePushNotificationResponseEventArgs(tmpParams.Data, tmpParams.Identifier, tmpParams.Type)); + delayedNotificationResponse = null; + } + } remove { @@ -120,33 +140,25 @@ public string[] SubscribedTopics{ public IPushNotificationHandler NotificationHandler { get; set; } - public static async Task Initialize(NSDictionary options, bool autoRegistration = true) + public static async Task Initialize(NSDictionary options, bool autoRegistration = true, bool enableDelayedResponse = true) { + EnableDelayedResponse = enableDelayedResponse; App.Configure(); CrossFirebasePushNotification.Current.NotificationHandler = CrossFirebasePushNotification.Current.NotificationHandler ?? new DefaultPushNotificationHandler(); - if(autoRegistration) + if (autoRegistration) { await CrossFirebasePushNotification.Current.RegisterForPushNotifications(); } - - - /*if (options != null && options.Keys != null && options.Keys.Count() != 0 && options.ContainsKey(new NSString("UIApplicationLaunchOptionsRemoteNotificationKey"))) - { - NSDictionary data = options.ObjectForKey(new NSString("UIApplicationLaunchOptionsRemoteNotificationKey")) as NSDictionary; - - // CrossFirebasePushNotification.Current.OnNotificationOpened(GetParameters(data)); - }*/ - } - public static async void Initialize(NSDictionary options, IPushNotificationHandler pushNotificationHandler, bool autoRegistration = true) + public static async void Initialize(NSDictionary options, IPushNotificationHandler pushNotificationHandler, bool autoRegistration = true, bool enableDelayedResponse = true) { CrossFirebasePushNotification.Current.NotificationHandler = pushNotificationHandler; await Initialize(options, autoRegistration); } - public static async void Initialize(NSDictionary options,NotificationUserCategory[] notificationUserCategories,bool autoRegistration = true) + public static async void Initialize(NSDictionary options,NotificationUserCategory[] notificationUserCategories,bool autoRegistration = true, bool enableDelayedResponse = true) { await Initialize(options, autoRegistration); @@ -335,6 +347,7 @@ public void WillPresentNotification(UNUserNotificationCenter center, UNNotificat System.Diagnostics.Debug.WriteLine("WillPresentNotification"); var parameters = GetParameters(notification.Request.Content.UserInfo); _onNotificationReceived?.Invoke(CrossFirebasePushNotification.Current, new FirebasePushNotificationDataEventArgs(parameters)); + CrossFirebasePushNotification.Current.NotificationHandler?.OnReceived(parameters); completionHandler(CurrentNotificationPresentationOption); @@ -515,10 +528,18 @@ public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNo else if (response.IsDismissAction) catType = NotificationCategoryType.Dismiss; - var notificationResponse = new NotificationResponse(parameters, $"{response.ActionIdentifier}".Equals("com.apple.UNNotificationDefaultActionIdentifier",StringComparison.CurrentCultureIgnoreCase)?string.Empty:$"{response.ActionIdentifier}",catType); - _onNotificationOpened?.Invoke(this,new FirebasePushNotificationResponseEventArgs(notificationResponse.Data,notificationResponse.Identifier,notificationResponse.Type)); - - CrossFirebasePushNotification.Current.NotificationHandler?.OnOpened(notificationResponse); + var notificationResponse = new NotificationResponse(parameters, $"{response.ActionIdentifier}".Equals("com.apple.UNNotificationDefaultActionIdentifier", StringComparison.CurrentCultureIgnoreCase)?string.Empty:$"{response.ActionIdentifier}",catType); + + if (EnableDelayedResponse && _onNotificationOpened == null) + { + delayedNotificationResponse = notificationResponse; + } + else + { + _onNotificationOpened?.Invoke(this, new FirebasePushNotificationResponseEventArgs(notificationResponse.Data, notificationResponse.Identifier, notificationResponse.Type)); + + CrossFirebasePushNotification.Current.NotificationHandler?.OnOpened(notificationResponse); + } // Inform caller it has been handled completionHandler();