React Native Android Приложение вылетает при получении уведомления FCM - PullRequest
0 голосов
/ 06 мая 2020

У меня есть собственное приложение React, и я пытаюсь реализовать уведомление pu sh с пакетом response-native-pu sh -notification и обменом облачными сообщениями firebase. Оказывается, когда я получаю уведомление, приложение просто перестает работать. Кажется, что функция RemotePushController работает, как только приложение запускается, я получаю журнал консоли с токеном. Я пробовал несколько вещей, но ничего не работает.

enter image description hereenter image description here

[enter image description here] [enter image description here[][2][2]

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 августа 2020

Для Android ничего устанавливать в AndroidManifest.xml не нужно. А на верхнем уровне build.gradle должно быть достаточно следующей конфигурации. Обратите внимание на «+» напротив версий.

buildscript {
    ext {
        buildToolsVersion = "28.0.3"
        minSdkVersion = 16
        compileSdkVersion = 28
        targetSdkVersion = 28
        googlePlayServicesVersion = "16.+"
        androidMapsUtilsVersion = "0.5+"
        firebaseVersion = "+"
        firebaseMessagingVersion = "+"
}

Вот ловушка, которую я создал для FCM.

import React, { useEffect } from 'react'
import { Alert } from 'react-native'
import messaging from '@react-native-firebase/messaging'
import { useNavigation } from '@react-navigation/native'
import { useAsyncStorage } from '@react-native-community/async-storage'

const useFirebaseCloudMessaging = () => {
  const navigation = useNavigation()
  const { getItem: getFcmToken, setItem: saveFcmToken } = useAsyncStorage('fcmToken')

  const [fcmToken, setFcmToken] = React.useState(null)
  const [initialRoute, setInitialRoute] = React.useState('Home')

  const getToken = async () => {
    const token = await getFcmToken()

    if (!token) {
      // Get the device token
      messaging()
        .getToken()
        .then(token => {
          setFcmToken(token)
          saveFcmToken(token)
        })
    }
  }

  const requestUserPermission = async () => {
    const authStatus = await messaging().requestPermission()
    const enabled =
      authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
      authStatus === messaging.AuthorizationStatus.PROVISIONAL

    if (enabled) {
      console.log('Authorization status:', authStatus)
    }
  }

  useEffect(() => {
    // If using other push notification providers (ie Amazon SNS, etc)
    // you may need to get the APNs token instead for iOS:
    // if(Platform.OS == 'ios') { messaging().getAPNSToken().then(token => { return saveTokenToDatabase(token); }); }

    // Listen to whether the token changes
    return messaging().onTokenRefresh(token => {
      saveFcmToken(token)
    })
  }, [])

  useEffect(() => {
    const unsubscribe = messaging().onMessage(async remoteMessage => {
      Alert.alert('A new FCM message arrived!', JSON.stringify(remoteMessage))
    })

    return unsubscribe
  }, [])

  useEffect(() => {
    // Assume a message-notification contains a "type" property in the data payload of the screen to open

    messaging().onNotificationOpenedApp(remoteMessage => {
      console.log(
        'Notification caused app to open from background state:',
        remoteMessage.notification
      )
      navigation.navigate(remoteMessage.data.type)
    })

    // Check whether an initial notification is available
    messaging()
      .getInitialNotification()
      .then(remoteMessage => {
        if (remoteMessage) {
          console.log(
            'Notification caused app to open from quit state:',
            remoteMessage.notification
          )
          setInitialRoute(remoteMessage.data.type) // e.g. "Settings"
        }
      })
  }, [])

  return {
    fcmToken,
    getToken,
    requestUserPermission
  }
}

export default useFirebaseCloudMessaging

Используйте ловушку в компоненте приложения верхнего уровня

import React, { useEffect } from 'react'

import Root from './App'
import useFirebaseCloudMessaging from './FirebaseCloudMessaging'

const App = () => {
  const {
    getToken,
    requestUserPermission
  } = useFirebaseCloudMessaging()

  useEffect(() => {
    requestUserPermission()
    getToken()
  }, [])

  return <Root />
}

export default App
0 голосов
/ 06 мая 2020

Мне удалось решить проблему, изменив версии googlePlayServicesVersion и firebaseMessagingVersion в android / build.gradle, как показано на изображении ниже. Я установил оба на «+».

enter image description here

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