[реагировать-родной][Android] приложение не получает уведомления

Наверное, это кажется глупым вопросом.

Я пытаюсь сделать нативное демо-приложение для Android с уведомлением Firebase, используя response-native-fcm.

После того, как все установлено, и Firebase регистрирует, что приложение подключено, я пытаюсь выполнить тест push-уведомлений, и приложение выполняет 2 действия:

  1. Это не регистрирует событие уведомления
  2. Он отключается через 10-20 секунд после того, как firebase отправит уведомление. (возможно, это какая-то ошибка в моем приложении, которую я проверю последней.)

Это слушатель уведомлений моего приложения:

Listeners.js

import {
  Platform,
  AsyncStorage
} from 'react-native';

import FCM, {
  FCMEvent,
  RemoteNotificationResult,
  WillPresentNotificationResult,
  NotificationType
} from "react-native-fcm";

AsyncStorage.getItem('lastNotification').then(data => {
  if (data) {
    // if notification arrives when app is killed, it should still be logged here
    console.log('last notification', JSON.parse(data));
    AsyncStorage.removeItem('lastNotification');
  }
})

export function registerKilledListener() {
  // these callback will be triggered even when app is killed
  FCM.on(FCMEvent.Notification, notif => {
    AsyncStorage.setItem('lastNotification', JSON.stringify(notif));
  });
}

// these callback will be triggered only when app is foreground or background
export function registerAppListener() {
  FCM.on(FCMEvent.Notification, notif => {
    console.log("Notification", notif);
    if (notif.local_notification) {
      return;
    }
    if (notif.opened_from_tray) {
      return;
    }

    if (Platform.OS === 'ios') {
      //optional
      //iOS requires developers to call completionHandler to end notification process. If you do not call it your background remote notifications could be throttled, to read more about it see the above documentation link.
      //This library handles it for you automatically with default behavior (for remote notification, finish with NoData; for WillPresent, finish depend on "show_in_foreground"). However if you want to return different result, follow the following code to override
      //notif._notificationType is available for iOS platfrom
      switch (notif._notificationType) {
        case NotificationType.Remote:
          notif.finish(RemoteNotificationResult.NewData) //other types available: RemoteNotificationResult.NewData, RemoteNotificationResult.ResultFailed
          break;
        case NotificationType.NotificationResponse:
          notif.finish();
          break;
        case NotificationType.WillPresent:
          notif.finish(WillPresentNotificationResult.All) //other types available: WillPresentNotificationResult.None
          break;
      }
    }
  });

  FCM.on(FCMEvent.RefreshToken, token => {
    console.log("TOKEN (refreshUnsubscribe)", token);
    this.props.onChangeToken(token);
  });

  FCM.enableDirectChannel();
  FCM.on(FCMEvent.DirectChannelConnectionChanged, (data) => {
    console.log('direct channel connected' + data);
  });
  setTimeout(function() {
    FCM.isDirectChannelEstablished().then(d => console.log(d));
  }, 1000);
}

Здесь находится управление уведомлением:

Notifications.js

import React, {
  Component
} from 'react'
import {
  Platform,
  View,
  TouchableOpacity,
  Text
} from 'react-native';
import FCM, {
  FCMEvent,
  RemoteNotificationResult,
  WillPresentNotificationResult,
  NotificationType
} from 'react-native-fcm';
import {
  registerKilledListener,
  registerAppListener
} from "./Listeners";

registerKilledListener();

export default class Notifications extends Component {

  constructor(props) {
    super(props);

    this.state = {
      token: "",
      tokenCopyFeedback: ""
    }
  }

  async componentDidMount() {
    registerAppListener();
    FCM.getInitialNotification().then(notif => {
      console.log(notif)
      this.setState({
        initNotif: notif
      })
    });

    try {
      let result = await FCM.requestPermissions({
        badge: false,
        sound: true,
        alert: true
      });
    } catch (e) {
      console.error(e);
    }

    FCM.getFCMToken().then(token => {
      console.log("TOKEN (getFCMToken)", token);
      this.setState({
        token: token || ""
      })
    });

    if (Platform.OS === 'ios') {
      FCM.getAPNSToken().then(token => {
        console.log("APNS TOKEN (getFCMToken)", token);
      });
    }
  }

  componentWillUnmount() {

  }

  render() {
    return null
  }
}

Я полностью потерян, и любая помощь будет оценена. Большое спасибо и извините за мои орфографические ошибки.

0 ответов

Другие вопросы по тегам