React-native-fcm不推送已关闭应用的通知

时间:2017-03-09 10:04:32

标签: android firebase react-native android-manifest firebase-cloud-messaging

我的应用程序仅在应用程序处于打开状态且处于后台时才收到通知。但我要求通知即使应用程序已关闭。我怎么能用react-native-fcm做反应?

我的代码如下所示,请参考

FCM.getInitialNotification().then(notif=>console.log(notif));
            FCM.requestPermissions(); // for iOS
            FCM.getFCMToken().then(token => {
                console.log(token)
                // store fcm token in your server
            });
            this.notificationListener = FCM.on(FCMEvent.Notification, async (notif) => {
                // there are two parts of notif. notif.notification contains the notification payload, notif.data contains data payload
                if(notif.local_notification){
                  //this is a local notification
                  return;
                }
                if(notif.opened_from_tray){
                  //app is open/resumed because user clicked banner
                  console.log('clicked');

                  return;
                }
                this.showLocalNotification(notif);

            });
            this.refreshTokenListener = FCM.on(FCMEvent.RefreshToken, (token) => {
                console.log(token)
                // fcm token may not be available on first load, catch it here
            });

      showLocalNotification(notif) {
          FCM.presentLocalNotification({
            title: notif.title,
            body: notif.body,
            priority: "high",
            click_action: notif.click_action,
            show_in_foreground: true,
            local: true
          });
      }
<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="22" />

    <application
      android:name=".MainApplication"
      android:allowBackup="true"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:theme="@style/AppTheme">

      <receiver android:name="com.evollu.react.fcm.FIRLocalMessagingPublisher"/>
      <receiver android:enabled="true" android:exported="true"  android:name="com.evollu.react.fcm.FIRSystemBootEventReceiver">
        <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED"/>
          <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
          <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
          <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
      </receiver>

      <service android:name="com.evollu.react.fcm.MessagingService" android:enabled="true" android:exported="true">
        <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
      </service>

      <service android:name="com.evollu.react.fcm.InstanceIdService" android:exported="false">
        <intent-filter>
          <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
      </service>

      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        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>
        <intent-filter>
          <action android:name="fcm.ACTION.HELLO" />
          <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
      </activity>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
      <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="XXXXXX"/>
    </application>

1 个答案:

答案 0 :(得分:3)

您的问题是如何推送通知。 FCM将仅识别并弹出包含属性“通知”的通知。

如果您需要命令

  

this.showLocalNotification(通知符);

显示您的通知,这意味着您正在本地管理通知,因此,您关闭的应用将无法管理它。

因此,请检查您将通知发送到云的方式,并确保只有在您没有“通知”属性时才会触发“FCMEvent.Notification”事件。

例如:

noteA = {notification: {title: "Notification Title", body:"Notification body"}, data: {optional: "content"}};
noteB = {title: "Notification Title", body:"Notification body"}, data: {optional: "content"}};

结果:

noteA:应该在不触发FCMEvent.Notification

的情况下弹出通知

noteB:应触发FCMEvent.Notification,如果调用this.showLocalNotification(notif),将显示本地通知。