/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule PushNotificationIOS * @flow */ 'use strict'; var RCTDeviceEventEmitter = require('RCTDeviceEventEmitter'); var RCTPushNotificationManager = require('NativeModules').PushNotificationManager; var invariant = require('invariant'); var _notifHandlers = {}; var _initialNotification = RCTPushNotificationManager && RCTPushNotificationManager.initialNotification; var DEVICE_NOTIF_EVENT = 'remoteNotificationReceived'; /** * Handle push notifications for your app, including permission handling and * icon badge number. * * To get up and running, [configure your notifications with Apple](https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/ConfiguringPushNotifications/ConfiguringPushNotifications.html) * and your server-side system. To get an idea, [this is the Parse guide](https://parse.com/tutorials/ios-push-notifications). */ class PushNotificationIOS { _data: Object; _alert: string | Object; _sound: string; _badgeCount: number; /** * Sets the badge number for the app icon on the home screen */ static setApplicationIconBadgeNumber(number: number) { RCTPushNotificationManager.setApplicationIconBadgeNumber(number); } /** * Gets the current badge number for the app icon on the home screen */ static getApplicationIconBadgeNumber(callback: Function) { RCTPushNotificationManager.getApplicationIconBadgeNumber(callback); } /** * Attaches a listener to remote notifications while the app is running in the * foreground or the background. * * The handler will get be invoked with an instance of `PushNotificationIOS` */ static addEventListener(type: string, handler: Function) { invariant( type === 'notification', 'PushNotificationIOS only supports `notification` events' ); _notifHandlers[handler] = RCTDeviceEventEmitter.addListener( DEVICE_NOTIF_EVENT, (notifData) => { handler(new PushNotificationIOS(notifData)); } ); } /** * Requests all notification permissions from iOS, prompting the user's * dialog box. */ static requestPermissions() { RCTPushNotificationManager.requestPermissions(); } /** * See what push permissions are currently enabled. `callback` will be * invoked with a `permissions` object: * * - `alert` :boolean * - `badge` :boolean * - `sound` :boolean */ static checkPermissions(callback: Function) { invariant( typeof callback === 'function', 'Must provide a valid callback' ); RCTPushNotificationManager.checkPermissions(callback); } /** * Removes the event listener. Do this in `componentWillUnmount` to prevent * memory leaks */ static removeEventListener(type: string, handler: Function) { invariant( type === 'notification', 'PushNotificationIOS only supports `notification` events' ); if (!_notifHandlers[handler]) { return; } _notifHandlers[handler].remove(); _notifHandlers[handler] = null; } /** * An initial notification will be available if the app was cold-launched * from a notification. * * The first caller of `popInitialNotification` will get the initial * notification object, or `null`. Subsequent invocations will return null. */ static popInitialNotification() { var initialNotification = _initialNotification && new PushNotificationIOS(_initialNotification); _initialNotification = null; return initialNotification; } /** * You will never need to instansiate `PushNotificationIOS` yourself. * Listening to the `notification` event and invoking * `popInitialNotification` is sufficient */ constructor(nativeNotif) { this._data = {}; // Extract data from Apple's `aps` dict as defined: // https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html Object.keys(nativeNotif).forEach((notifKey) => { var notifVal = nativeNotif[notifKey]; if (notifKey === 'aps') { this._alert = notifVal.alert; this._sound = notifVal.sound; this._badgeCount = notifVal.badge; } else { this._data[notifKey] = notifVal; } }); } /** * An alias for `getAlert` to get the notification's main message string */ getMessage(): ?string | ?Object { // alias because "alert" is an ambiguous name return this._alert; } /** * Gets the sound string from the `aps` object */ getSound(): ?string { return this._sound; } /** * Gets the notification's main message from the `aps` object */ getAlert(): ?string | ?Object { return this._alert; } /** * Gets the badge count number from the `aps` object */ getBadgeCount(): ?number { return this._badgeCount; } /** * Gets the data object on the notif */ getData(): ?Object { return this._data; } } module.exports = PushNotificationIOS;