androidfirebasereact-nativenotificationsreact-native-fcm

evollu/react-native-fcm - ClassNotFoundException


My App runs well, but... when it recives a notification from Firebase it Crash.

I think it's happening because my configuration is bad since i had implemented the "react-native-fcm" example.

I getFCMToken() succesfull.

Do you look any error? Do you know why is happening it? Ideas? HelP!!

CONSOLE ERRORS

package.json

"dependencies": {
    "firebase": "^4.8.2",
    "lodash": "^4.17.4",
    "moment": "^2.20.1",
    "react": "16.0.0-alpha.12",
    "react-firebase-storage-connector": "^1.1.0",
    "react-native": "0.47",
    "react-native-fbsdk": "^0.7.0",
    "react-native-fcm": "^13.3.1",
    "react-native-fetch-blob": "^0.10.8",
    "react-native-image-picker": "^0.26.7",
    "react-native-modal": "^5.0.0",
    "react-native-responsive-image": "^2.2.0",
    "react-native-side-menu": "^1.1.3",
    "react-native-textinput-effects": "^0.4.2",
    "react-native-vector-icons": "^4.5.0",
    "react-navigation": "^1.0.0-beta.11",
    "react-redux": "^5.0.6",
    "redux": "^3.7.2",
    "redux-thunk": "^2.2.0",
    "slugify": "^1.2.9"
},

app/build.gradlew

      compileSdkVersion 27
      buildToolsVersion "27.0.1"

      defaultConfig {
          applicationId "com.reactnavigationdrawer"
          minSdkVersion 16
          targetSdkVersion 22
          versionCode 1
          versionName "1.0"
          ndk {
              abiFilters "armeabi-v7a", "x86"
          }
      }

  dependencies {
      compile fileTree(dir: "libs", include: ["*.jar"])
      compile "com.android.support:appcompat-v7:+"
      compile "com.facebook.react:react-native:+"  // From node_modules
      compile(project(':react-native-fbsdk')) {
       exclude(group: 'com.facebook.android', module: 'facebook-android-sdk')
      }
      compile('com.facebook.android:facebook-android-sdk:4.22.1')
      compile ("com.google.android.gms:play-services-base:11.2.0") {
        force = true;
     }
      compile ('com.google.firebase:firebase-core:11.2.0') {
          force = true;
      }
      compile ('com.google.firebase:firebase-auth:11.2.0') {
          force = true;
      }
      compile (project(':react-native-fcm')){
          exclude group: "com.google.firebase"
      }
      compile ("com.google.android.gms:play-services-gcm:11.2.0") {
          force = true;
      }
      compile project(':react-native-vector-icons')
      compile project(':react-native-fetch-blob')
      compile project(':react-native-image-picker')

  }

  apply plugin: 'com.google.gms.google-services'

build.gradlew

    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.+' // <- USE 2.2.+ version
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.google.gms:google-services:3.0.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

MainActivity.java

  package com.reactnavigationdrawer;

  import com.facebook.react.ReactActivity;
  import android.content.Intent;

  public class MainActivity extends ReactActivity {

      @Override
      public void onNewIntent (Intent intent) {
          super.onNewIntent(intent);
          setIntent(intent);
      }

      @Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          MainApplication.getCallbackManager().onActivityResult(requestCode, resultCode, data);
      }

      @Override
      protected String getMainComponentName() {
          return "reactnavigationdrawer";
      }
  }

MainApplication.java

  @Override
  protected List<ReactPackage> getPackages() {
     return Arrays.<ReactPackage>asList(
        new MainReactPackage(),
        new VectorIconsPackage(),
        new ImagePickerPackage(),
        new RNFetchBlobPackage(),
        new FIRMessagingPackage(),
        new FBSDKPackage(mCallbackManager)
    );
 }

AndroidManifest.xml

  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.reactnavigationdrawer"
      android:versionCode="1"
      android:versionName="1.0">

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.CAMERA" />
      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
      <uses-permission android:name="android.permission.VIBRATE" />
      <uses-feature android:name="android.hardware.camera" android:required="false"/>
      <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>

      <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">

        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
        <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_launcher"/>

        <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>

        <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>
        <activity
          android:name=".MainActivity"
          android:launchMode="singleTop"
          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>
        </activity>
        <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
      </application>
  </manifest>

if you need more information you'll tell me!


Solution

  • the error reads ...

    unable to resolve superclass of com.evullu.react.fcm.MessagingService

    this means either reference in the Mainfest.xml is wrongful and / or the referenced class com.evullu.react.fcm.MessagingService does not exist. it might probably be rather called com.reactnavigationdrawer.MessagingService (or alike) and there's no need to compile the obsoleted package play-services-gcm either.

    better add a dependency for com.google.firebase:firebase-messaging:11.8.0 ...which should contain the superclass of com.evullu.react.fcm.MessagingService, which cannot be resolved. you can check with ./gradlew app:dependencies | grep firebase whether it is present.

    that file build.gradlew should be called build.gradle and Android Studio might complain about outdated versions ...meanwhile it's com.android.tools.build:gradle:3.0.1 & com.google.gms:google-services:3.1.2. that force = true; also seems useless in that context, at least don't understand what it shall do there, see ResolutionStrategy.