首页 > 解决方案 > 辅助应用程序的 FirebaseMessaging.getInstance(firebaseApp) 应该是公共的,但它是私有的?

问题描述

我正在尝试为辅助 Firebase App 订阅 FCM(Firebase 云消息传递)主题,根据文档,这可以通过getInstance将辅助 FirebaseApp 实例作为参数的重载来完成:

https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/messaging/FirebaseMessaging#public-static-synchronized-firebasemessaging-getinstance-firebaseapp-app

public static synchronized FirebaseMessaging getInstance (FirebaseApp app)

获取指定 FirebaseApp 的 FirebaseMessaging 实例。

我正在使用 Kotlin,我正在build.gradle像这样拉入包:

implementation "com.google.firebase:firebase-messaging:20.2.0"

但是,当我尝试FirebaseMessaging使用重载实例化 时getInstance,我收到一条错误消息,指出它不可访问。当我查看包源时,反编译显示重载的构造函数不像无参数那样是公共的getInstance

public class FirebaseMessaging {
    public static final String INSTANCE_ID_SCOPE = "FCM";
    private final Context zzb;
    private final FirebaseInstanceId zzc;
    private final Task<zzab> zzd;
    @Nullable
    @SuppressLint({"FirebaseUnknownNullness"})
    @VisibleForTesting
    static TransportFactory zza;

    @NonNull
    public static synchronized FirebaseMessaging getInstance() {
        return getInstance(FirebaseApp.getInstance());
    }

    @Keep
    @NonNull
    static synchronized FirebaseMessaging getInstance(@NonNull FirebaseApp var0) {
        return (FirebaseMessaging)var0.get(FirebaseMessaging.class);
    }

我错过了什么?

标签: androidfirebasekotlinfirebase-cloud-messaging

解决方案


我已经验证了一种方法,因为我遇到了类似的问题。

我使用该google-services.json文件注册了其中一个项目。

现在根据文档

public void onNewToken(字符串令牌)

在为默认Firebase 项目生成新令牌时调用。

在这里,“默认”一词至关重要。它提到onNewToken了被覆盖的方法FirebaseMessagingService(例如:MyFirebaseMessagingService)只会为默认项目调用。

因此,在这种情况下,使用 配置的第一个项目google-services.json将是默认项目,并且onNewToken将调用该方法。

对于第二个项目,我使用以下文档手动配置项目:

val options = FirebaseOptions.Builder()
        .setProjectId("my-firebase-project")
        .setApplicationId("1:27992087142:android:ce3b6448250083d1")
        .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw")
        .build()

参数值可以从google-services.json第二个项目的文件中获得。 (注意:不要在项目中包含第二个google-services.json项目)

google-services.json手动代码映射

  1. projectId (setProjectId) : project_idjson 根目录中的键
  2. 应用程序标识(setApplicationId)client > client_info > mobilesdk_app_id:。如果有多个项目,请确保使用的客户端package_name与 Android 应用程序匹配
  3. apiKey (setApiKey) : client > api_key > current_key(请确保这里的包名也是如此。

关键代码

在文档中很难找到的最重要部分是获取第二个 firebase 项目的令牌。

val app = Firebase.initialize(this, options, "ANY_FIXED_STRING_EXCEPT_DEFAULT")

val firebaseMessaging = app.get(FirebaseMessaging::class.java) as FirebaseMessaging

ymFirebaseMessaging.token.addOnCompleteListener{
                if (!it.isSuccessful) {
                    Log.d(TAG, "Fetching FCM token failed", it.exception)

                    return@addOnCompleteListener
                }


                val token = it.result
                Log.d(TAG, "YM: $token")
                Toast.makeText(
                    activity,
                    "$TAG: Got token",
                    Toast.LENGTH_LONG
                ).show()
}

推荐阅读