我在一个原生项目中遇到了一个主要是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
的代码
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"
如果重要的话,我使用的是react-native-fcm。上面的代码片段是来自该存储库的修改代码。
之前的研究:
force = true
应该防止firebase的多个副本四处漂浮。我不认为这个project)minifyEnabled false
)如何解决此问题?
发布于 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
在这里,您必须替换:
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'
这将通过指定所需的版本来防止使用最新版本的库。
https://stackoverflow.com/questions/50592049
复制相似问题