首页 > 解决方案 > 在应用程序被杀死时处理 FCM 通知

问题描述

为了探索 FCM 推送通知原理,我开发了一个基本应用程序。当我的应用程序处于前台时,一切都按预期进行,通知由 _createNotificationListeners() 函数处理。但是,当应用程序处于后台或终止 bgMessaging 文件中的代码时,本应处理传入通知的代码根本没有任何效果。

当我的应用程序被杀死时,我应该怎么做才能处理通知?

应用程序.js

import React, { Component } from 'react';
import { Text, View } from 'react-native';
import AsyncStorage from '@react-native-community/async-storage';
import firebase from 'react-native-firebase';


export default class PushAgain extends Component {
  render() {
    return (
      <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
        <Text>My Basic Push Notification App !</Text>
      </View>
    );
  }

  async _getToken() {
      let fcmToken = await AsyncStorage.getItem('fcmToken');
      if (!fcmToken) {
      fcmToken = await firebase.messaging().getToken();
      if (fcmToken) {
          await AsyncStorage.setItem('fcmToken', fcmToken);
      }
      }

      console.log('fcmToken:', fcmToken);
  }

  async _checkPermission() {
      const enabled = await firebase.messaging().hasPermission();
      if (enabled) {
      this._getToken();
      } else {
      this._requestPermission();
      }
  }

  async _requestPermission() {
      try {
      await firebase.messaging().requestPermission();
      this._getToken();
      } catch (error) {
      console.log('permission rejected');
      }
  }

  async _createNotificationListeners() {
      firebase.notifications().onNotification(notification => {
      notification.android.setChannelId('insider').setSound('default');

      firebase.notifications().displayNotification(notification);
      console.log('Notification title:', notification.title);
      });
  }

  async componentDidMount() {
    // Build a channel.
    const channel = new firebase.notifications.Android.Channel('insider', 'insider channel', firebase.notifications.Android.Importance.Max)
    // Create the channel.
    firebase.notifications().android.createChannel(channel);
    this._checkPermission();
    this._createNotificationListeners();
  }
}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.pushagain">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:allowBackup="false"
      android:theme="@style/AppTheme">
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />

      <service android:name="io.invertase.firebase.messaging.RNFirebaseMessagingService">
    <intent-filter>
      <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
      </service>

      <meta-data
       android:name="com.google.firebase.messaging.default_notification_channel_id"
       android:value="@string/default_notification_channel_id" />

    <!-- Background Messages (Optional) -->

      <service android:name="io.invertase.firebase.messaging.RNFirebaseBackgroundMessagingService" />
    <receiver android:name="io.invertase.firebase.notifications.RNFirebaseBackgroundNotificationActionReceiver" android:exported="true">
      <intent-filter>
          <action android:name="io.invertase.firebase.notifications.BackgroundAction"/>
      </intent-filter>
      </receiver>
      <service android:name="io.invertase.firebase.notifications.RNFirebaseBackgroundNotificationActionsService"/>

    </application>

</manifest>

字符串.xml

<resources>
    <string name="app_name">PushAgain</string>
    <string name="default_notification_channel_id" translatable="false">fcm_default_channel</string>
</resources>

index.js

import {AppRegistry} from 'react-native';
import App from './App';
import {name as appName} from './app.json';
import bgMessaging from './src/bgMessaging';

AppRegistry.registerComponent(appName, () => App);
// New task registration
AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => bgMessaging);

bgMessaging.js

import firebase from 'react-native-firebase';
// Optional flow type
import type { RemoteMessage } from 'react-native-firebase';

export default async (message: RemoteMessage) => {
  const channel = new firebase.notifications.Android.Channel('test-channel', 'test channel', firebase.notifications.Android.Importance.Max)
  .setDescription('My apps test channel');
  // Create the channel
  firebase.notifications().android.createChannel(channel);

  const notification = new firebase.notifications.Notification()
  .setNotificationId(message.messageId)
  .setTitle('bgMessaging notification')
  .setBody('Notification handled in bgMessaging')
  .setSound(message.data.sound);

  notification
  .android.setChannelId('test-channel')
  .android.setSmallIcon('ic_launcher');

  firebase.notifications().displayNotification(notification);

    return Promise.resolve();
}

标签: androidreact-nativereact-native-fcm

解决方案


推荐阅读