FirebaseMessaging不使用google-services.json来支持多个项目

时间:2016-10-07 09:10:27

标签: android firebase firebase-cloud-messaging

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

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

这有可能吗?

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

如果不可能,有没有办法将一个客户与另一个客户隔离,那么他们就无法向另一个客户的设备发送通知(假设他们可以在某些客户的设备上获得有效的目标设备令牌)方式)?

3 个答案:

答案 0 :(得分:2)

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

邮件到达后,您可以对通过RemoteMessage回调传递的onMessageReceived对象的{{1}}字段进行过滤。

答案 1 :(得分:1)

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

博客文章描述了两个步骤:

  1. 禁用FirebaseInitProvider
  2. 将其添加到AndroidManifest.xml以禁用默认初始化代码:

    <provider
      android:name="com.google.firebase.provider.FirebaseInitProvider"
      android:authorities="${applicationId}.firebaseinitprovider"
      tools:node="remove"
      />
    
    1. 调用FirebaseApp.initializeApp(Context,FirebaseOptions)
    2. 只要您准备好必要的配置,请使用以下命令自行初始化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

答案 2 :(得分:0)

如果您导航到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