React Native在后台推送本地通知(已杀死)

时间:2020-08-20 14:31:13

标签: react-native

我正在编码一个需要在后台推送通知的应用程序(应用程序被杀死)。

它的抽搐通知应用程序。

我在存储带有Redux的频道的持久性(异步存储)。

我该怎么办?您是否有与此相关的任何文档?

1 个答案:

答案 0 :(得分:1)

您可以使用诸如https://github.com/zo0r/react-native-push-notification之类的推送通知库和诸如https://github.com/transistorsoft/react-native-background-fetch之类的后台任务库。然后,您可以在后台任务中调用您的推送通知。

请记住,运行后台任务之间的最小间隔为15分钟。因此间隔只能是15分钟或更长。


为使此答案更有用,这是我以前用来在后台处理推送通知的以前的实现,以使您了解如何执行此操作:

import PushNotification from 'react-native-push-notification';

export default class NotificationService {
  constructor(onRegister, onNotification) {
    this.configure(onRegister, onNotification);
    this.lastId = 0;
  }
  // Handles a user push notification registration
  configure(onRegister, onNotification, gcm = '') {
    PushNotification.configure({
      // (optional) Called when Token is generated (iOS and Android)
      onRegister: onRegister,

      // (required) Called when a remote or local notification is opened or received
      onNotification: onNotification,

      // ANDROID ONLY: GCM Sender ID (optional - not required for local notifications, but is need to receive remote push notifications)
      senderID: gcm,

      /**
       * (optional) default: true
       * - Specified if permissions (ios) and token (android and ios) will requested or not,
       * - if not, you must call PushNotificationsHandler.requestPermissions() later
       */
      requestPermissions: true,
    });
  }
  // Send a direct push notification to the user
  localNotif() {
    this.lastId++;
    PushNotification.localNotification({
      /* Android Only Properties */
      id: '' + this.lastId,
      bigText: 'My big text that will be shown when notification is expanded',
      subText: 'This is a subText',

      /* iOS and Android properties */
      title: 'Local Notification',
      message: 'My Notification Message',
      actions: '["Yes", "No"]', // (Android only) See the doc for notification actions to know more
    });
  }

  // Schedules a push notification by a given javascript Date object
  scheduleNotif(date, title, message) {
    this.lastId++;
    PushNotification.localNotificationSchedule({
      date: date,

      /* Android Only Properties */
      id: '' + this.lastId,
      bigText: '',
      subText: '',

      /* iOS and Android properties */
      title: title,
      message: message,
    });
  }

  checkPermission(cbk) {
    return PushNotification.checkPermissions(cbk);
  }

  cancelNotif() {
    PushNotification.cancelLocalNotifications({ id: '' + this.lastId });
  }

  cancelAll() {
    PushNotification.cancelAllLocalNotifications();
  }
}
// ...
import BackgroundFetch from 'react-native-background-fetch';


const initBackGroundFetch = () => {
  BackgroundFetch.configure(
    {
      minimumFetchInterval: 15, // <-- minutes (15 is minimum allowed)
      // Android options
      forceAlarmManager: false, // <-- Set true to bypass JobScheduler.
      stopOnTerminate: false,
      startOnBoot: true,
      requiredNetworkType: BackgroundFetch.NETWORK_TYPE_ANY, // Network connection needed
    },
    async taskId => {
      // Do stuff with notifications, for example:
      const notificationService = new NotificationService(
         () => {//... what to do on register},
         () => {//... what to do on notification }
      )
      const date = new Date(Date.now() + 60 * 1000) // adjust according to your use case
      notificationService.scheduleNotif(date, "title", "message");
      BackgroundFetch.finish(taskId);
    },
    error => {
      console.log('[js] RNBackgroundFetch failed to start');
    },
  );
};

const App = () => {
  useEffect(() => {
     initBackGroundFetch();
  }, []);

  return (
    // ...
  );
};

NotificationService是react native推送通知库提供的示例的调整版本:https://github.com/zo0r/react-native-push-notification/blob/master/example/NotifService.js