private static void ProcessRemoteNotification(NSDictionary options, bool fromFinishedLaunching, UIApplicationState applicationState)
{
//Check to see if the dictionary has the aps key. This is the notification payload you would have sent
if (options != null && options.ContainsKey(new NSString("aps")))
{
#if DEBUG
log(" ******* PROCESSING REMOTE NOTIFICATION Notification Payload received");
#endif
NotificationData notificationData = new NotificationData();
string alert = string.Empty;
string sound = string.Empty;
int badge = -1;
try {
//Get the aps dictionary
NSDictionary aps = options.ObjectForKey(new NSString("aps")) as NSDictionary;
//Extract the alert text
//NOTE: Just for the simple alert specified by " aps:{alert:"alert msg here"} "
// For complex alert with Localization keys, etc., the "alert" object from the aps dictionary
// will be another NSDictionary... Basically the json gets dumped right into a NSDictionary, so keep that in mind
if (aps.ContainsKey(new NSString("alert")))
{
string alertType = "undefined";
if (aps[new NSString("alert")].GetType() == typeof(NSString))
{
alert = (aps [new NSString("alert")] as NSString).ToString();
alertType = "NSString";
}
else if (aps [new NSString("alert")].GetType() == typeof(NSDictionary))
{
NSDictionary alertNSDictionary = aps.ObjectForKey(new NSString("alert")) as NSDictionary;
alertType = "NSDictionary";
// We only get "body" key from that dictionary
if (alertNSDictionary.ContainsKey(new NSString("body")) &&
(alertNSDictionary[new NSString("body")].GetType() == typeof(NSString)))
{
alert = (alertNSDictionary [new NSString("body")] as NSString).ToString();
}
}
#if DEBUG
log("******* PROCESSING NOTIFICATION Notification Payload contains an alert message. Type [" + alertType + "]");
#endif
}
//Extract the sound string
if (aps.ContainsKey(new NSString("sound")) && (aps [new NSString("sound")].GetType() == typeof(NSString)))
{
sound = (aps [new NSString("sound")] as NSString).ToString();
#if DEBUG
log("******* PROCESSING NOTIFICATION Notification Payload contains sound");
#endif
}
//Extract the badge
if (aps.ContainsKey(new NSString("badge")) && (aps [new NSString("badge")].GetType() == typeof(NSObject)))
{
string badgeStr = (aps [new NSString("badge")] as NSObject).ToString();
int.TryParse(badgeStr, out badge);
#if DEBUG
log("******* PROCESSING NOTIFICATION Notification Payload contains a badge number: " + badge);
#endif
}
//If this came from the ReceivedRemoteNotification while the app was running,
// we of course need to manually process things like the sound, badge, and alert.
if (!fromFinishedLaunching && applicationState == UIApplicationState.Active)
{
#if DEBUG
log("******* PROCESSING NOTIFICATION app was running, so manually showing notification");
#endif
UIRemoteNotificationType enabledRemoteNotificationTypes = UIApplication.SharedApplication.EnabledRemoteNotificationTypes;
bool alertEnabled = ((enabledRemoteNotificationTypes & UIRemoteNotificationType.Alert) == UIRemoteNotificationType.Alert);
bool soundEnabled = ((enabledRemoteNotificationTypes & UIRemoteNotificationType.Sound) == UIRemoteNotificationType.Sound);
bool badgeEnabled = ((enabledRemoteNotificationTypes & UIRemoteNotificationType.Badge) == UIRemoteNotificationType.Badge);
#if DEBUG
log("******* PROCESSING NOTIFICATION types enabled: alert[" + alertEnabled + "], sound[" + soundEnabled + "], badge[" + badgeEnabled + "]");
#endif
//Manually set the badge in case this came from a remote notification sent while the app was open
if (badgeEnabled)
{
UpdateApplicationIconBadgeNumber(badge);
}
//Manually play the sound
if (soundEnabled)
{
PlayNotificationSound(sound);
}
//Manually show an alert
if (alertEnabled)
{
ShowNotificationAlert("Notification", alert);
}
}
Dictionary <String, Object> customDic = PushNotificationsUtils.ConvertToDictionary(new NSMutableDictionary(options));
customDic.Remove("aps"); // it is not needed to pass the "aps" (notification iOS data) inside the "custom data json string"
notificationData.CustomDataJsonString = PushNotificationsUtils.JSONSerialize(customDic);
} catch (System.Exception ex) {
#if DEBUG
log(" ******* Unhanlded exception processing notification payload received. Exception message: " + ex.Message);
#endif
} finally {
notificationData.AlertMessage = alert;
notificationData.Badge = badge;
notificationData.Sound = sound;
PushNotificationsUtils.FireUnityJavascriptEvent("Appverse.PushNotifications.OnRemoteNotificationReceived", notificationData);
}
}
else
{
#if DEBUG
log(" ******* NO Notification Payload received");
#endif
}
}