【问题标题】:FirebaseMessaging without using google-services.json to support multiple projectsFirebaseMessaging 不使用 google-services.json 来支持多个项目
【发布时间】:2020-10-13 17:35:59
【问题描述】:

我知道可以使用自定义选项创建一个命名的FirebaseApp 实例以用于FirebaseDatabase,但我特别需要能够针对不同的(在运行时确定)Firebase 使用FirebaseMessagaging项目。

我遇到的问题是 FirebaseMessaging.getInstance() 不支持 name 参数。

这有可能吗?

我需要支持单独项目的原因是我们的客户端连接到不同的客户服务器,因此每个客户都将拥有自己的 firebase 帐户并生成自己的通知。

如果不可能,是否有任何方法可以将一个客户与另一个客户隔离,这样他们就不可能向另一个客户的设备发送通知(假设他们可以通过某种方式获得有效的目标设备令牌)?

【问题讨论】:

标签: android firebase firebase-cloud-messaging


【解决方案1】:

The Firebase Blog contains a post about this exact issue,并提供如何处理的指南。

博文描述了两个步骤:

  1. 禁用 FirebaseInitProvider

将此添加到 AndroidManifest.xml 以禁用默认初始化代码:

<provider
  android:name="com.google.firebase.provider.FirebaseInitProvider"
  android:authorities="${applicationId}.firebaseinitprovider"
  tools:node="remove"
  />
  1. 调用 FirebaseApp.initializeApp(Context, FirebaseOptions)

准备好必要的配置后,请自行初始化 Firebase:

FirebaseOptions.Builder builder = new FirebaseOptions.Builder()
  .setApplicationId("1:0123456789012:android:0123456789abcdef")
  .setApiKey("your_api_key")
  .setDatabaseUrl("https://your-app.firebaseio.com")
  .setStorageBucket("your-app.appspot.com");
FirebaseApp.initializeApp(this, builder.build());

Google Services Plugin documentation 描述了如何从 JSON 中获取您需要的值:

{YOUR_CLIENT} 是 client 对象,其中包含与您的包名称(应用程序 ID)匹配的 client_info/android_client_info/package_name。

google_app_id:{YOUR_CLIENT}/client_info/mobilesdk_app_id

gcm_defaultSenderId:project_info/project_number

default_web_client_id:{YOUR_CLIENT}/oauth_client/client_id (client_type == 3)

ga_trackingId:{YOUR_CLIENT}/services/analytics-service/analytics_property/tracking_id

firebase_database_url:project_info/firebase_url

google_api_key:{YOUR_CLIENT}/api_key/current_key

google_crash_reporting_api_key:{YOUR_CLIENT}/api_key/current_key

【讨论】:

  • @geisterfurz007 我在发布后不久就意识到了这一点,并开始编译链接中提供的指南摘要。现在已对答案进行了编辑,以包含更多有用的信息。
  • 谢谢!评论已删除;不幸的是,旗帜通过了,对不起。
【解决方案2】:

要允许单个客户端接收来自多个发件人的消息,您可以使用FirebaseInstanceId.getToken(A_SENDER_ID, "FCM") 方法。因此无需检索多个 Messaging 实例来管理多个发件人。

消息到达后,您可以过滤通过onMessageReceived 回调传递的RemoteMessage 对象的from 字段。

【讨论】:

    【解决方案3】:

    如果您导航到FirebaseMessaging 类,您会看到有一个私有包getInstance,它采用firebaseApp。此外,您还会看到 getInstance() 也使用默认的 firebase 应用程序作为参数。你可以通过反射得到它。

    val firebaseApp = buildFirebaseApp()
    
    val method = FirebaseMessaging::class.java.getDeclaredMethod("getInstance", FirebaseApp::class.java)
    // Set the non-public accessible if security allowed
    method.isAccessible = true
    val fcmMessaging = method.invoke(null, firebaseApp) as FirebaseMessaging
    

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2018-11-03
      • 2022-08-15
      • 1970-01-01
      相关资源
      最近更新 更多