Как я могу устранить ошибку NoSuchMethodError, вызванную firebase '`subscribeToTopic`? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть проблема в среде выполнения android / java, возникающая в реактивном проекте.Я не думаю, что response-native имеет какое-либо отношение к проблеме, но может быть полезным для понимания кода или ошибок.Я получаю сообщение об ошибке ниже:

java.lang.RuntimeException: не удалось вызвать RNFIRMessaging.subscribeToTopic

, который выходит из реактивной среды.Метод try-catch в методе не улавливает ошибку, но код выполняется вплоть до момента, когда вызывается FirebaseMessaging.getInstance().subscribeToTopic(topic);.

Это внутренняя ошибка, которая является реальной причиной:

... Причина: java.lang.NoSuchMethodError: Нет виртуального метода subscribeToTopic (Ljava / lang / String;) Lcom / google / android / gms / tasks / Task;в классе Lcom / google / firebase / messaging / FirebaseMessaging;или его суперклассы (объявление 'com.google.firebase.messaging.FirebaseMessaging' появляется в ...

Этот код соответствует RNFIRMessaging.subscribeToTopic:

public class FIRMessagingModule extends ReactContextBaseJavaModule implements LifecycleEventListener, ActivityEventListener {
   ...
   @Override
   public String getName() {
       return "RNFIRMessaging";
   }
   ...
   public void subscribeToTopic(String topic) {
     try {
         Log.w("MYFCM", "Trying to call subscribeToTopic");
         FirebaseMessaging x = FirebaseMessaging.getInstance();
         if (x == null)
             Log.w("MYFCM", "hasinstance?: NO");
         else {
             Log.w("MYFCM", "hasinstance?: YES");
             // use reflection to print the methods
             Class c = x.getClass();
             for (java.lang.reflect.Method method : c.getDeclaredMethods()) {
                 Log.w("MYFCM", "methods: " + method.getName());
             }
         }
         FirebaseMessaging.getInstance().subscribeToTopic(topic);
     } catch(Exception ex) {
         Log.e("MYFCM", ex.getMessage());
     }
   }
   ...
}

Это приводит к следующему выводу журнала из adb logcat. Обратите внимание, как, по-видимому, рефлексия считает, что существует метод subscribeToTopic.

05-29 12:21:46.760  8188  8261 W MYFCM   : Trying to call subscribeToTopic
05-29 12:21:46.760  8188  8261 W MYFCM   : Trying hasinstance?: YES
05-29 12:21:46.760  8188  8261 W MYFCM   : methods: getInstance
05-29 12:21:46.760  8188  8261 W MYFCM   : methods: isAutoInitEnabled
05-29 12:21:46.760  8188  8261 W MYFCM   : methods: send
05-29 12:21:46.760  8188  8261 W MYFCM   : methods: setAutoInitEnabled
05-29 12:21:46.760  8188  8261 W MYFCM   : methods: subscribeToTopic
05-29 12:21:46.760  8188  8261 W MYFCM   : methods: unsubscribeFromTopic
05-29 12:21:46.761  8188  8261 E unknown:ReactNative: Exception in native call
05-29 12:21:46.761  8188  8261 E unknown:ReactNative: java.lang.RuntimeException: Could not invoke RNFIRMessaging.subscribeToTopic

Я подозреваю, что мои файлы gradle могут находиться в области видимости этой проблемы:

/ android / build.gradle:

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.google.gms:google-services:3.2.1'
    }
...
}
ext {
    targetSdkVersion            = 25
    compileSdkVersion           = 25
    buildToolsVersion           = "27.0.3"
    googlePlayServicesVersion   = "15.0.2"
    firebaseVersion             = "15.0.2"
    supportLibVersion           = "25.4.0"
    reactNativeVersion          = "0.53.3"
}

/ android / app / build.gradle:

dependencies {
...
    implementation("com.google.firebase:firebase-core:$firebaseVersion") { force = true }
    implementation("com.google.firebase:firebase-messaging:$firebaseVersion") { force = true }
    implementation("com.android.support:exifinterface:$supportLibVersion") { force = true }
    implementation("com.google.android.gms:play-services-vision:$googlePlayServicesVersion") { force = true }
    implementation ("com.google.android.gms:play-services-gcm:$googlePlayServicesVersion") { force = true }
...
}
...
apply plugin: "com.google.gms.google-services"

Если это имеет значение, я использую response-native-fcm . Приведенный выше фрагмент кода представляет собой измененный код из этого хранилища.

Предыдущее исследование:

  • Не думаю, этот вопрос применимо, поскольку force = true должно предотвращать плавание вокруг множества копий базы огня.
  • Мне не нравится Этот вопрос применим, так как это бесконечно повторяется (даже если я сдуваювсе и заново клонируем проект)
  • В некоторых похожих вопросах упоминается proguard.Ард отключен (minifyEnabled false)

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 30 мая 2018

У меня была точно такая же проблема, она связана с новым выпуском firebase (https://firebase.google.com/support/release-notes/android#20180523)

. Мне удалось исправить это (временно), изменив файл в собственной реактивной библиотеке fcm:

. / Node_modules / Reaction-native-fcm / android / build.gradle

Там вы должны заменить:

compile 'com.google.firebase:firebase-core:+'
compile 'com.google.firebase:firebase-messaging:+'

на конкретныйверсию, которую вы хотите использовать, в вашем случае я думаю, что это 15.0.2, поэтому она должна быть:

compile 'com.google.firebase:firebase-core:15.0.2'
compile 'com.google.firebase:firebase-messaging:15.0.2'

Это предотвратит использование последней версии библиотек, указав нужную версию.

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