using System; using System.Globalization; using Foundation; using UIKit; using UserNotifications; namespace gehGassi.LocalNotifications.Platforms { public class LocalNotificationDelegate : UNUserNotificationCenterDelegate { public override void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler) { Console.WriteLine("**-----**-----**-----**----** LocalNotifications DidReceiveNotificationResponse **-----**-----**-----**----**"); try { if (response is null) return; if (!response.IsDefaultAction) return; if (response.Notification.Request.Content.Badge != null) { UIApplication.SharedApplication.InvokeOnMainThread(() => { nint appBadges = UIApplication.SharedApplication.ApplicationIconBadgeNumber - response.Notification.Request.Content.Badge.Int32Value; UIApplication.SharedApplication.ApplicationIconBadgeNumber = appBadges; }); } NSDictionary dictionary = response.Notification.Request.Content.UserInfo; IosNotification iosNotification = GetiOSNotification(dictionary); if (iosNotification != null) NotificationService.OnPlatformNotificationTapped(iosNotification.Payload, iosNotification.NotificationId, iosNotification.IsLocal); completionHandler?.Invoke(); } catch (Exception ex) { Console.WriteLine("Error in DidReceiveNotificationResponse : " + ex.Message); } } public override void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action completionHandler) { Console.WriteLine("**-----**-----**-----**----** LocalNotifications WillPresentNotification **-----**-----**-----**----**"); try { //default value UNNotificationPresentationOptions presentationOptions = UNNotificationPresentationOptions.None; UNNotificationContent notificationContent = notification?.Request.Content; if (notificationContent != null) { NSDictionary dictionary = notificationContent.UserInfo; IosNotification iosNotification = GetiOSNotification(dictionary); NotificationService.OnPlatformNotificationReceived(iosNotification.Payload, iosNotification.NotificationId, iosNotification.IsLocal); NSNumber _presentAlert = (NSNumber)notification.Request.Content.UserInfo[NotificationService.PRESENT_ALERT]; NSNumber _playSound = (NSNumber)notification.Request.Content.UserInfo[NotificationService.PLAY_SOUND]; NSNumber _showBadge = (NSNumber)notification.Request.Content.UserInfo[NotificationService.SHOW_BADGE]; if (_presentAlert != null && _presentAlert.BoolValue) presentationOptions |= UNNotificationPresentationOptions.Alert; if (_playSound != null && _playSound.BoolValue) presentationOptions |= UNNotificationPresentationOptions.Sound; if (_showBadge != null && _showBadge.BoolValue) presentationOptions |= UNNotificationPresentationOptions.Badge; } completionHandler?.Invoke(presentationOptions); } catch (Exception ex) { Console.WriteLine("Error in WillPresentNotification : " + ex.Message); } } private IosNotification GetiOSNotification(NSDictionary dictionary) { string payload = dictionary[NotificationService.PAYLOAD]?.ToString(); int? notificationId = (dictionary[NotificationService.NOTIFICATION_ID] as NSNumber)?.Int32Value; bool isFromFirebase = false; int? isLocalNumber = (dictionary[NotificationService.NOTIFICATION_ISLOCAL] as NSNumber)?.Int32Value; bool isLocal = isLocalNumber.HasValue && isLocalNumber.Value == 1; if (string.IsNullOrEmpty(payload) && !notificationId.HasValue) { var error = new NSError(); var jsonData = NSJsonSerialization.Serialize(dictionary, NSJsonWritingOptions.PrettyPrinted, out error); var jsonText = new NSString(jsonData, NSStringEncoding.UTF8); // Re-Get Payload & NotificatioinId from Firebase payload = jsonText; string notifId = dictionary[NotificationService.NOTIFICATION_ID_FIREBASE]?.ToString(); if (!string.IsNullOrEmpty(notifId)) { notificationId = new NSNumber(int.Parse(notifId)).Int32Value; isFromFirebase = true; } } return new IosNotification(notificationId, payload, isLocal); } private class IosNotification { public int? NotificationId { get; } public string Payload { get; } public bool IsLocal { get; } public IosNotification(int? notificationId, string payload, bool isLocal) { NotificationId = notificationId; Payload = payload; IsLocal = isLocal; } } } }