首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何解析firebase‘`subscribeToTopic`导致的NoSuchMethodError?

如何解析firebase‘`subscribeToTopic`导致的NoSuchMethodError?
EN

Stack Overflow用户
提问于 2018-05-30 03:58:43
回答 1查看 1.4K关注 0票数 3

我在一个原生项目中遇到了一个主要是android/java的运行时问题。我不认为react-native与这个问题有任何关系,但可能有助于理解所涉及的代码或错误。我一直收到以下错误:

java.lang.RuntimeException:无法调用RNFIRMessaging.subscribeToTopic

这来自于react-native框架。方法中的try-catch不会捕获错误,但是代码会一直执行到FirebaseMessaging.getInstance().subscribeToTopic(topic);被调用的地方。

这是真正的罪魁祸首--内部错误:

...原因:在类Lcom/google/firebase/messaging/FirebaseMessaging;或它的超类中没有虚方法subscribeToTopic(Ljava/lang/String;)Lcom/google/android/gms/tasks/Task;( 'com.google.firebase.messaging.FirebaseMessaging‘的声明出现在...

这是对应于RNFIRMessaging.subscribeToTopic的代码

代码语言:javascript
复制
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方法存在的。

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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"

如果重要的话,我使用的是react-native-fcm。上面的代码片段是来自该存储库的修改代码。

之前的研究:

  • 我不认为this question是适用的,因为force = true应该防止firebase的多个副本四处漂浮。我不认为这个project)
  • Some是适用的,因为它是无限可重复的(即使我吹掉所有东西并重新克隆
  • 类似的问题提到this question。Proguard已禁用(minifyEnabled false)

如何解决此问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-30 08:14:47

我也遇到了完全相同的问题,这与firebase (https://firebase.google.com/support/release-notes/android#20180523)的新版本有关。

我可以通过修改react原生fcm库中的文件来(临时)修复它:

./node_modules/react-native-fcm/android/build.gradle

在这里,您必须替换:

代码语言:javascript
复制
compile 'com.google.firebase:firebase-core:+'
compile 'com.google.firebase:firebase-messaging:+'

根据您想要使用的特定版本,在您的情况下,我认为它是15.0.2,所以它应该是:

代码语言:javascript
复制
compile 'com.google.firebase:firebase-core:15.0.2'
compile 'com.google.firebase:firebase-messaging:15.0.2'

这将通过指定所需的版本来防止使用最新版本的库。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50592049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档