Невозможно получить данные уведомления, тело, когда приложение находится в фоновом режиме или закрыто в React-native-firebase android - PullRequest
0 голосов
/ 16 января 2019

Я использую реактивную базу-огонь в своем приложении для облачных сообщений + уведомления он получает все тело и данные, когда приложение используется, но не может получить ничего, когда приложение закрыто или находится в фоновом режиме ....

Я пробовал Headless JS, но это тоже не работает

когда я нажимаю на уведомление и когда оно открывается, приложение показывает это {"google.priority":"high"}

спасибо заранее ....

это мой андроид мэйнфест

<application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
      android:largeHeap="true">
      <meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        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>
      <!---firebase -->
      <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"/> -->
   <service android:name="io.invertase.firebase.messaging.RNFirebaseBackgroundMessagingService" />
  <!---firebase end-->
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
    </application>

это моя функция componentdidmount ()

 async componentDidMount() {
      this.getValueLocally();
      requestCameraLOCATION()

        const notificationOpen: NotificationOpen = await firebase.notifications().getInitialNotification();
        if (notificationOpen) {
            const action = notificationOpen.action;
            const notification: Notification = notificationOpen.notification;
            var seen = [];
            alert(JSON.stringify(notification.data, function(key, val) {
                if (val != null && typeof val == "object") {
                    if (seen.indexOf(val) >= 0) {
                        return;
                    }
                    seen.push(val);
                }
                return val;
            }));
        }
        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);
        this.notificationDisplayedListener = firebase.notifications().onNotificationDisplayed((notification: Notification) => {
            // Process your notification as required
            // ANDROID: Remote notifications do not contain the channel ID. You will have to specify this manually if you'd like to re-display the notification.
        });
        this.notificationListener = firebase.notifications().onNotification((notification: Notification) => {
            // Process your notification as required
            notification
                .android.setChannelId('test-channel')
                .android.setSmallIcon('ic_launcher');
            firebase.notifications()
                .displayNotification(notification);

        });
        this.notificationOpenedListener = firebase.notifications().onNotificationOpened((notificationOpen: NotificationOpen) => {
            // Get the action triggered by the notification being opened
            const action = notificationOpen.action;
            // Get information about the notification that was opened
            const notification: Notification = notificationOpen.notification;
            var seen = [];
            alert(JSON.stringify(notification.data, function(key, val) {
                if (val != null && typeof val == "object") {
                    if (seen.indexOf(val) >= 0) {
                        return;
                    }
                    seen.push(val);
                }
                return val;
            }));
            firebase.notifications().removeDeliveredNotification(notification.notificationId);

        });
    }






              async checkPermission() {
                firebase.messaging().hasPermission()
                .then(enabled => {
                  if (enabled) {
                    this.getToken();
                  } else {
                    this.requestPermission();
                  }
                });}


                  async getToken() {
                    let fcmToken = await AsyncStorage.getItem('fcmToken');
                    if (!fcmToken) {
                      fcmToken = await firebase.messaging().getToken();
                      if (fcmToken) {
                        // user has a device token
                        await AsyncStorage.setItem('fcmToken', fcmToken);
                      }
                    }
                  }
                  async requestPermission() {
                    firebase.messaging().requestPermission()
                    .then(() => {
                      this.getToken();
                    })
                    .catch(error => {
                      console.warn(error);
                    });
                  }

а это мой bgMessaging.js

import firebase from 'react-native-firebase';
import type { RemoteMessage } from 'react-native-firebase';
import type { Notification,NotificationOpen} from 'react-native-firebase';

export default async (message: RemoteMessage) => {

    const newNotification = new firebase.notifications.Notification()
            .android.setChannelId(message.data.channelId)
            .setNotificationId(message.messageId)
            .setTitle(message.data.title)
            .setBody(message.data.body)
            .setSound("default")
            .setData(message.Data)
            .android.setAutoCancel(true)
            .android.setSmallIcon('ic_notification')
            .android.setCategory(firebase.notifications.Android.Category.Alarm)

    // Build a channel
    const channelId = new firebase.notifications.Android.Channel(message.data.channelId, channelName, firebase.notifications.Android.Importance.Max);

    // Create the channel
    firebase.notifications().android.createChannel(channelId);
    firebase.notifications().displayNotification(newNotification)

    return Promise.resolve();

}

1 Ответ

0 голосов
/ 30 апреля 2019

Есть два типа сообщений:

notification + data сообщений, которые будут обрабатываться FCM в фоновом режиме (т. Е. Ваш код не будет иметь доступа к уведомлению), и будут вызывать onNotification в то время как на переднем плане,

data-only сообщения будут вызывать headlessjs в фоновом режиме / закрыто и будут вызывать onMessage в то время как на переднем плане.

примечание: если вы удалите title и body, ваше сообщение будет классифицировано как второе. также данные необязательны в первой категории.

Подведем итог:

для сообщений только для данных:

  • Приложение на переднем плане: onMessage запущено

  • Приложение в фоновом режиме / Приложение закрыто: фоновый обработчик (HeadlessJS)

для уведомлений + сообщения данных:

  • Приложение на переднем плане: onNotification запущено

  • Приложение в фоновом режиме / Приложение закрыто: onNotificationOpened срабатывает при нажатии на уведомление

для получения дополнительной информации и для iOS прочтите официальные документы для сообщений только для данных и уведомления + сообщения данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...