UNPKG

nativescript-firebase-updated-new

Version:
476 lines 20.5 kB
import { SharedNotificationDelegate } from "@nativescript/shared-notification-delegate"; import { Application, ApplicationSettings, Device } from "@nativescript/core"; import { firebase } from "../firebase-common"; import { firebaseUtils } from "../utils"; let _notificationActionTakenCallback; let _pendingNotifications = []; let _pendingActionTakenNotifications = []; let _pushToken; let _receivedPushTokenCallback; let _receivedNotificationCallback; let _registerForRemoteNotificationsRanThisSession = false; let _userNotificationCenterDelegateObserver; let _firebaseRemoteMessageDelegate; let _showNotifications = true; let _showNotificationsWhenInForeground = false; let _userNotificationCenterDidReceiveNotificationResponseWithCompletionHandler; let _autoClearBadge = true; let _resolveWhenDidRegisterForNotifications; let _rejectWhenDidFailToRegisterForNotifications; const NOTIFICATIONS_REGISTRATION_KEY = "Firebase-RegisterForRemoteNotifications"; export function initFirebaseMessaging(options) { if (!options) { return; } _showNotifications = options.showNotifications === undefined ? _showNotifications : !!options.showNotifications; _showNotificationsWhenInForeground = options.showNotificationsWhenInForeground === undefined ? _showNotificationsWhenInForeground : !!options.showNotificationsWhenInForeground; _autoClearBadge = options.autoClearBadge === undefined ? _autoClearBadge : !!options.autoClearBadge; _userNotificationCenterDidReceiveNotificationResponseWithCompletionHandler = options.userNotificationCenterDidReceiveNotificationResponseWithCompletionHandler; if (options.onMessageReceivedCallback !== undefined) { addOnMessageReceivedCallback(options.onMessageReceivedCallback); } if (options.onPushTokenReceivedCallback !== undefined) { addOnPushTokenReceivedCallback(options.onPushTokenReceivedCallback); } } export function addOnMessageReceivedCallback(callback) { return new Promise((resolve, reject) => { try { ApplicationSettings.setBoolean(NOTIFICATIONS_REGISTRATION_KEY, true); _receivedNotificationCallback = callback; _registerForRemoteNotifications(resolve, reject); _processPendingNotifications(); resolve(); } catch (ex) { console.log("Error in messaging.addOnMessageReceivedCallback: " + ex); reject(ex); } }); } export function getCurrentPushToken() { return new Promise((resolve, reject) => { try { if (typeof (FIRMessaging) !== "undefined") { resolve(FIRMessaging.messaging().FCMToken); } else { resolve(_pushToken); } } catch (ex) { console.log("Error in messaging.getCurrentPushToken: " + ex); reject(ex); } }); } export function registerForPushNotifications(options) { return new Promise((resolve, reject) => { try { initFirebaseMessaging(options); _registerForRemoteNotificationsRanThisSession = false; _registerForRemoteNotifications(resolve, reject); } catch (ex) { console.log("Error in messaging.registerForPushNotifications: " + ex); reject(ex); } }); } export function unregisterForPushNotifications() { return new Promise((resolve, reject) => { try { UIApplication.sharedApplication.unregisterForRemoteNotifications(); resolve(); } catch (ex) { console.log("Error in messaging.unregisterForPushNotifications: " + ex); reject(ex); } }); } export function handleRemoteNotification(app, userInfo) { const userInfoJSON = firebaseUtils.toJsObject(userInfo); const aps = userInfo.objectForKey("aps"); if (aps !== null) { const alrt = aps.objectForKey("alert"); if (alrt !== null && alrt.objectForKey) { userInfoJSON.title = alrt.objectForKey("title"); userInfoJSON.body = alrt.objectForKey("body"); } } userInfoJSON.foreground = app.applicationState === 0; updateUserInfo(userInfoJSON); _pendingNotifications.push(userInfoJSON); if (_receivedNotificationCallback) { _processPendingNotifications(); } } export function addOnPushTokenReceivedCallback(callback) { return new Promise((resolve, reject) => { try { _receivedPushTokenCallback = callback; if (_pushToken) { callback(_pushToken); } ApplicationSettings.setBoolean(NOTIFICATIONS_REGISTRATION_KEY, true); _registerForRemoteNotifications(); _processPendingNotifications(); resolve(); } catch (ex) { console.log("Error in messaging.addOnPushTokenReceivedCallback: " + ex); reject(ex); } }); } export function addBackgroundRemoteNotificationHandler(appDelegate) { appDelegate.prototype.applicationDidRegisterForRemoteNotificationsWithDeviceToken = (application, deviceToken) => { if (areNotificationsEnabled()) { _resolveWhenDidRegisterForNotifications && _resolveWhenDidRegisterForNotifications(); } else { _rejectWhenDidFailToRegisterForNotifications && _rejectWhenDidFailToRegisterForNotifications(); } if (typeof (FIRMessaging) !== "undefined") { FIRMessaging.messaging().APNSToken = deviceToken; } else { const token = deviceToken.debugDescription.replace(/[< >]/g, ""); _pushToken = token; if (_receivedPushTokenCallback) { _receivedPushTokenCallback(token); } } }; appDelegate.prototype.applicationDidFailToRegisterForRemoteNotificationsWithError = (application, error) => { if (error.localizedDescription.indexOf("not supported in the simulator") > -1) { _resolveWhenDidRegisterForNotifications && _resolveWhenDidRegisterForNotifications(); } else { _rejectWhenDidFailToRegisterForNotifications && _rejectWhenDidFailToRegisterForNotifications(error.localizedDescription); } }; appDelegate.prototype.applicationDidReceiveRemoteNotificationFetchCompletionHandler = (app, notification, completionHandler) => { if (typeof (FIRAuth) !== "undefined") { if (firebase._configured && FIRAuth.auth().canHandleNotification(notification)) { completionHandler(1); return; } } completionHandler(0); handleRemoteNotification(app, notification); }; } export function registerForInteractivePush(model) { let nativeActions = []; model.iosSettings.interactiveSettings.actions.forEach(((action) => { let notificationActionOptions = action.options ? action.options.valueOf() : UNNotificationActionOptionNone; let actionType = action.type || "button"; let nativeAction; if (actionType === "input") { nativeAction = UNTextInputNotificationAction.actionWithIdentifierTitleOptionsTextInputButtonTitleTextInputPlaceholder(action.identifier, action.title, notificationActionOptions, action.submitLabel || "Submit", action.placeholder); } else if (actionType === "button") { nativeAction = UNNotificationAction.actionWithIdentifierTitleOptions(action.identifier, action.title, notificationActionOptions); } else { console.log("Unsupported action type: " + action.type); } nativeActions.push(nativeAction); })); let actions = NSArray.arrayWithArray(nativeActions); let nativeCategories = []; model.iosSettings.interactiveSettings.categories.forEach(category => { let nativeCategory = UNNotificationCategory.categoryWithIdentifierActionsIntentIdentifiersOptions(category.identifier, actions, null, null); nativeCategories.push(nativeCategory); }); const nsSetCategories = new NSSet(nativeCategories); UNUserNotificationCenter.currentNotificationCenter().setNotificationCategories(nsSetCategories); if (model.onNotificationActionTakenCallback) { _addOnNotificationActionTakenCallback(model.onNotificationActionTakenCallback); } } export function prepAppDelegate() { _addObserver("com.firebase.iid.notif.refresh-token", notification => onTokenRefreshNotification(notification.object)); _addObserver(UIApplicationDidFinishLaunchingNotification, appNotification => { if (ApplicationSettings.getBoolean(NOTIFICATIONS_REGISTRATION_KEY, false)) { _registerForRemoteNotifications(); } }); _addObserver(UIApplicationDidBecomeActiveNotification, appNotification => { _processPendingNotifications(); }); } export function subscribeToTopic(topicName) { return new Promise((resolve, reject) => { try { if (typeof (FIRMessaging) === "undefined") { reject("Enable FIRMessaging in Podfile first"); return; } FIRMessaging.messaging().subscribeToTopicCompletion(topicName, (error) => { error ? reject(error.localizedDescription) : resolve(); }); } catch (ex) { console.log("Error in messaging.subscribeToTopic: " + ex); reject(ex); } }); } export function unsubscribeFromTopic(topicName) { return new Promise((resolve, reject) => { try { if (typeof (FIRMessaging) === "undefined") { reject("Enable FIRMessaging in Podfile first"); return; } FIRMessaging.messaging().unsubscribeFromTopicCompletion(topicName, error => { error ? reject(error.localizedDescription) : resolve(); }); } catch (ex) { console.log("Error in messaging.unsubscribeFromTopic: " + ex); reject(ex); } }); } export const onTokenRefreshNotification = token => { _pushToken = token; if (_receivedPushTokenCallback) { _receivedPushTokenCallback(token); } }; export class IosInteractivePushSettings { } export var IosInteractiveNotificationActionOptions; (function (IosInteractiveNotificationActionOptions) { IosInteractiveNotificationActionOptions[IosInteractiveNotificationActionOptions["authenticationRequired"] = 1] = "authenticationRequired"; IosInteractiveNotificationActionOptions[IosInteractiveNotificationActionOptions["destructive"] = 2] = "destructive"; IosInteractiveNotificationActionOptions[IosInteractiveNotificationActionOptions["foreground"] = 4] = "foreground"; })(IosInteractiveNotificationActionOptions || (IosInteractiveNotificationActionOptions = {})); export class IosPushSettings { } export class PushNotificationModel { } export class NotificationActionResponse { } export function areNotificationsEnabled() { return UIApplication.sharedApplication.currentUserNotificationSettings.types > 0; } const updateUserInfo = userInfoJSON => { if (userInfoJSON.aps && userInfoJSON.aps.alert) { userInfoJSON.title = userInfoJSON.aps.alert.title; userInfoJSON.body = userInfoJSON.aps.alert.body; } if (!userInfoJSON.hasOwnProperty("data")) { userInfoJSON.data = {}; } Object.keys(userInfoJSON).forEach(key => { if (key !== "data") userInfoJSON.data[key] = userInfoJSON[key]; }); userInfoJSON.aps = undefined; }; function _registerForRemoteNotifications(resolve, reject) { let app = UIApplication.sharedApplication; if (!app) { Application.on(Application.launchEvent, () => _registerForRemoteNotifications(resolve, reject)); return; } if (_registerForRemoteNotificationsRanThisSession) { resolve && resolve(); return; } _registerForRemoteNotificationsRanThisSession = true; _resolveWhenDidRegisterForNotifications = resolve; _rejectWhenDidFailToRegisterForNotifications = reject; if (parseInt(Device.osVersion) >= 10) { const authorizationOptions = 4 | 2 | 1; UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptionsCompletionHandler(authorizationOptions, (granted, error) => { if (!error) { if (app === null) { app = UIApplication.sharedApplication; } if (app !== null) { firebaseUtils.invokeOnRunLoop(() => app.registerForRemoteNotifications()); } } else { console.log("Error requesting push notification auth: " + error); reject && reject(error.localizedDescription); } }); if (_showNotifications) { _userNotificationCenterDelegateObserver = new FirebaseNotificationDelegateObserverImpl((unnotification, actionIdentifier, inputText) => { const userInfo = unnotification.request.content.userInfo; const userInfoJSON = firebaseUtils.toJsObject(userInfo); updateUserInfo(userInfoJSON); if (actionIdentifier) { _pendingActionTakenNotifications.push({ actionIdentifier, userInfoJSON, inputText }); if (_notificationActionTakenCallback) { _processPendingActionTakenNotifications(); } userInfoJSON.notificationTapped = actionIdentifier === UNNotificationDefaultActionIdentifier; } else { userInfoJSON.notificationTapped = false; } userInfoJSON.foreground = UIApplication.sharedApplication.applicationState === 0; _pendingNotifications.push(userInfoJSON); if (_receivedNotificationCallback) { _processPendingNotifications(); } }); SharedNotificationDelegate.addObserver(_userNotificationCenterDelegateObserver); } if (typeof (FIRMessaging) !== "undefined") { _firebaseRemoteMessageDelegate = FIRMessagingDelegateImpl.new().initWithCallback((appDataDictionary) => { const userInfoJSON = firebaseUtils.toJsObject(appDataDictionary); updateUserInfo(userInfoJSON); _pendingNotifications.push(userInfoJSON); const asJs = firebaseUtils.toJsObject(appDataDictionary.objectForKey("notification")); if (asJs) { userInfoJSON.title = asJs.title; userInfoJSON.body = asJs.body; } const app = UIApplication.sharedApplication; if (app.applicationState === 0) { userInfoJSON.foreground = true; if (_receivedNotificationCallback) { _processPendingNotifications(); } } else { userInfoJSON.foreground = false; } }); FIRMessaging.messaging().delegate = _firebaseRemoteMessageDelegate; } } else { const notificationTypes = 4 | 1 | 2 | 1; const notificationSettings = UIUserNotificationSettings.settingsForTypesCategories(notificationTypes, null); firebaseUtils.invokeOnRunLoop(() => { app.registerForRemoteNotifications(); }); app.registerUserNotificationSettings(notificationSettings); } } function _addOnNotificationActionTakenCallback(callback) { return new Promise((resolve, reject) => { try { _notificationActionTakenCallback = callback; _processPendingActionTakenNotifications(); resolve(); } catch (ex) { console.log("Error in messaging._addOnNotificationActionTakenCallback: " + ex); reject(ex); } }); } function _processPendingNotifications() { const app = UIApplication.sharedApplication; if (!app) { Application.on("launch", () => _processPendingNotifications()); return; } if (_receivedNotificationCallback) { for (let p in _pendingNotifications) { _receivedNotificationCallback(_pendingNotifications[p]); } _pendingNotifications = []; if (app.applicationState === 0 && _autoClearBadge) { app.applicationIconBadgeNumber = 0; } } } function _processPendingActionTakenNotifications() { const app = UIApplication.sharedApplication; if (!app) { Application.on("launch", () => _processPendingNotifications()); return; } if (_notificationActionTakenCallback) { for (let p in _pendingActionTakenNotifications) { _notificationActionTakenCallback(_pendingActionTakenNotifications[p].actionIdentifier, _pendingActionTakenNotifications[p].userInfoJSON, _pendingActionTakenNotifications[p].inputText); } _pendingActionTakenNotifications = []; if (app.applicationState === 0 && _autoClearBadge) { app.applicationIconBadgeNumber = 0; } } } function _addObserver(eventName, callback) { return NSNotificationCenter.defaultCenter.addObserverForNameObjectQueueUsingBlock(eventName, null, NSOperationQueue.mainQueue, callback); } class FirebaseNotificationDelegateObserverImpl { constructor(callback) { this.observerUniqueKey = "firebase-messaging"; this.callback = callback; } userNotificationCenterWillPresentNotificationWithCompletionHandler(center, notification, completionHandler, next) { const userInfo = notification.request.content.userInfo; const userInfoJSON = firebaseUtils.toJsObject(userInfo); if (!(notification.request.trigger instanceof UNPushNotificationTrigger)) { next(); return; } if (_showNotificationsWhenInForeground || userInfoJSON["gcm.notification.showWhenInForeground"] === "true" || userInfoJSON["showWhenInForeground"] === true || (userInfoJSON.aps && userInfoJSON.aps.showWhenInForeground === true)) { completionHandler(4 | 2 | 1); } else { completionHandler(0); } this.callback(notification); } userNotificationCenterDidReceiveNotificationResponseWithCompletionHandler(center, response, completionHandler, next) { if (_userNotificationCenterDidReceiveNotificationResponseWithCompletionHandler) { _userNotificationCenterDidReceiveNotificationResponseWithCompletionHandler(center, response, completionHandler); } if (!(response.notification.request.trigger instanceof UNPushNotificationTrigger)) { next(); return; } if (response && response.actionIdentifier === UNNotificationDismissActionIdentifier) { completionHandler(); return; } this.callback(response.notification, response.actionIdentifier, response.userText); completionHandler(); } } var FIRMessagingDelegateImpl = /** @class */ (function (_super) { __extends(FIRMessagingDelegateImpl, _super); function FIRMessagingDelegateImpl() { return _super !== null && _super.apply(this, arguments) || this; } FIRMessagingDelegateImpl.new = function () { if (FIRMessagingDelegateImpl.ObjCProtocols.length === 0 && typeof (FIRMessagingDelegate) !== "undefined") { FIRMessagingDelegateImpl.ObjCProtocols.push(FIRMessagingDelegate); } return _super.new.call(this); }; FIRMessagingDelegateImpl.prototype.initWithCallback = function (callback) { this.callback = callback; return this; }; FIRMessagingDelegateImpl.prototype.messagingDidReceiveMessage = function (messaging, remoteMessage) { this.callback(remoteMessage.appData); }; FIRMessagingDelegateImpl.prototype.messagingDidReceiveRegistrationToken = function (messaging, fcmToken) { onTokenRefreshNotification(fcmToken); }; FIRMessagingDelegateImpl.ObjCProtocols = []; return FIRMessagingDelegateImpl; }(NSObject)); //# sourceMappingURL=messaging.ios.js.map