android - 辅助应用程序的 FirebaseMessaging.getInstance(firebaseApp) 应该是公共的,但它是私有的?
问题描述
我正在尝试为辅助 Firebase App 订阅 FCM(Firebase 云消息传递)主题,根据文档,这可以通过getInstance
将辅助 FirebaseApp 实例作为参数的重载来完成:
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);
}
我错过了什么?
解决方案
我已经验证了一种方法,因为我遇到了类似的问题。
我使用该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
手动代码映射
- projectId (setProjectId) :
project_id
json 根目录中的键 - 应用程序标识(setApplicationId)
client > client_info > mobilesdk_app_id
:。如果有多个项目,请确保使用的客户端package_name
与 Android 应用程序匹配 - 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()
}
推荐阅读
- java - RecycleView 重叠上的浮动操作按钮
- c# - 如何传递一个 int 数组和一个 List
作为使用 SWIG 时从 C# 到 C++ 的参数 - php - PHP - 连接到不同的服务器数据库
- sql - 每当业务发生变化时标记
- javascript - 具有自动列计数的 CSS 表格到网格
- javascript - 在 typescript 中开发 cytospace.js 扩展
- python-3.x - pip 遇到问题
- scala - scala.tools.reflect.ToolBoxError:反射编译失败:由于 java.lang.VerifyError 无法初始化编译器
- android - 如何在 OpenGL 中从二进制图像中绘制形状?
- spring-kafka - 在执行 KafkaTemplate.send 时在 catch 块中捕获 InterruptedException 时是否应该重新引发中断?