сбой приложения react native после отправки уведомления из firebase через gcm

#android #react-native #google-cloud-messaging

#Android #react-native #google-облако-обмен сообщениями

Вопрос:

всякий раз, когда я пытаюсь отправить уведомление из firebase, происходит сбой моего приложения.

затем я пытаюсь выяснить, откуда произошел сбой с помощью adb logcat.

похоже, что с зависимостями gcm что-то не так, я понятия не имею, откуда берется ошибка.

в нем говорилось «не удалось создать экземпляр получателя com.google.android.gms.gcm.GcmReceiver»

вот изображение ошибки : произошел сбой приложения

мои зависимости от build.gradle :

 implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.facebook.react:react-native: "  // From node_modules
implementation 'com.google.firebase:firebase-analytics:17.2.2'
implementation "com.google.android.gms:play-services-base:16.1.0"
implementation "com.google.firebase:firebase-core:16.0.9"
implementation "com.google.firebase:firebase-messaging:18.0.0"
implementation project(':react-native-push-notification')
  

и мой AndroidManifest.xml выглядит так :

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

    <uses-permission android:name="android.permission.INTERNET" />
    
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <permission
        android:name="com.hidroponik.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.hidroponik.permission.C2D_MESSAGE" />
    <!-- < Only if you're using GCM or localNotificationSchedule() > -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:roundIcon="@mipmap/ic_launcher"
      android:usesCleartextTraffic="true"
      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" />
      

      <meta-data  android:name="com.dieam.reactnativepushnotification.notification_channel_name"
                android:value="YOUR NOTIFICATION CHANNEL NAME"/>
        <meta-data  android:name="com.dieam.reactnativepushnotification.notification_channel_description"
                    android:value="YOUR NOTIFICATION CHANNEL DESCRIPTION"/>
        <!-- Change the resource name to your App's accent color - or any other color you want -->
        <meta-data  android:name="com.dieam.reactnativepushnotification.notification_color"
                    android:resource="@android:color/white"/><!-- < Only if you're using GCM or localNotificationSchedule() > -->
        <receiver
            android:name="com.google.android.gms.gcm.GcmReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.hidroponik" />
            </intent-filter>
        </receiver>
        <!-- < Only if you're using GCM or localNotificationSchedule() > --><receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
        <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
        <service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationRegistrationService"/><!-- < Only if you're using GCM or localNotificationSchedule() > -->
        <service
            android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerServiceGcm"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>
        <!-- </ Only if you're using GCM or localNotificationSchedule() > --><!-- < Else > -->
        <service
            android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>


    </application>

</manifest>
  

прошу прощения за длинный код, пожалуйста, помогите мне

Ответ №1:

хорошо, я разобрался.

прежде всего, я виноват в том, что не добавил

 "com.google.android.gms:play-services-gcm:17.0.0"
  

зависимости в процессе сборки.

и затем я обнаружил другую проблему после этого.

проблема в том, что gcm устарел.

10 апреля 2018 года Google устарел от GCM. Серверные и клиентские API GCM были удалены 29 мая 2019 года, и в настоящее время можно ожидать, что любые вызовы этих API завершатся неудачей. Перенесите приложения GCM в Firebase Cloud Messaging (FCM), который наследует надежную и масштабируемую инфраструктуру GCM, а также множество новых функций.

и затем я следую руководству по миграции по адресу ==> GCM Migrate to документация FCM

в руководстве написано, что я должен заменить build.gradle

эта строка

 "com.google.android.gms:play-services-gcm:17.0.0"
  

Для

 "com.google.firebase:firebase-messaging:20.2.4"
  

а затем перейдите к AndroidManifest.xml мне нужно удалить определенный код.
потому что

FCM SDK автоматически добавляет все необходимые разрешения, а также требуемую функциональность приемника.

итак, это то, что я удаляю из своего AndroidManifest.xml

это

 <uses-permission android:name="android.permission.WAKE_LOCK" />
    <permission
        android:name="com.hidroponik.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.hidroponik.permission.C2D_MESSAGE" />
  

и это

 <receiver
  android:name="com.google.android.gms.gcm.GcmReceiver"
  android:exported="true"
  android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
  <category android:name="com.hidroponik" />
  

после этого уведомления работают нормально, без каких-либо ошибок.

я надеюсь, что этот вопрос может помочь другим.

Комментарии:

1. У меня это сработало. Спасибо

2. рад, что это помогло вам