capacitor-community / fcm

Enable Firebase Cloud Messaging for Capacitor apps
https://capacitor.ionicframework.com/docs/
MIT License
237 stars 83 forks source link

Crashes on getToken() #65

Closed Cyral closed 3 years ago

Cyral commented 3 years ago

Hi,

I've been using this plugin for some time and recently upgraded another capacitor plugin and synced my packages. Not sure what would cause this to happen because nothing changed with this package (no new version in yarn.lock), but I am now getting this error after my app's splash screen.

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.getcapacitor.Bridge$1.run(Bridge.java:551)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.os.HandlerThread.run(HandlerThread.java:67)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.getcapacitor.PluginHandle.invoke(PluginHandle.java:99)
        at com.getcapacitor.Bridge$1.run(Bridge.java:542)
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.os.HandlerThread.run(HandlerThread.java:67) 
     Caused by: java.lang.IllegalStateException: Method addObserver must be called on the main thread
        at androidx.lifecycle.LifecycleRegistry.enforceMainThreadIfNeeded(LifecycleRegistry.java:317)
        at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:172)
        at androidx.fragment.app.Fragment.initLifecycle(Fragment.java:471)
        at androidx.fragment.app.Fragment.<init>(Fragment.java:451)
        at com.google.android.gms.common.api.internal.zzc.<init>(Unknown Source:1)
        at com.google.android.gms.common.api.internal.zzc.zza(Unknown Source:14)
        at com.google.android.gms.common.api.internal.LifecycleCallback.getFragment(Unknown Source:3)
        at com.google.android.gms.common.api.internal.LifecycleCallback.getFragment(Unknown Source:7)
        at com.google.android.gms.tasks.zzu$zza.zza(Unknown Source:1)
        at com.google.android.gms.tasks.zzu.addOnSuccessListener(Unknown Source:36)
        at com.getcapacitor.community.fcm.FCMPlugin.getToken(FCMPlugin.java:82)

I was able to fix it by changing the getToken method to:

getActivity().runOnUiThread(() -> {
            FirebaseMessaging.getInstance().getToken().addOnSuccessListener(getActivity(), token -> {
                JSObject data = new JSObject();
                data.put("token", token);
                call.success(data);
            }).addOnFailureListener(e -> call.error("Failed to get instance FirebaseID", e));
        });

But I'm not an Android developer so I'm not sure if that is all a good idea.

aabanaag commented 3 years ago

Encountere this as well, it says getToken is undefined

Cyral commented 3 years ago

For whatever reason, upgrading to capacitor v3 fixed this issue. Must have been something weird with how the dependencies were resolved

stewones commented 3 years ago

v2 with support for Capacitor 3 and Firebase 8 has been released