【问题标题】:Prevent 3rd party libraries to get my push notifications阻止 3rd 方库获取我的推送通知
【发布时间】:2019-05-27 23:45:26
【问题描述】:

我的应用正在实施 FCM,以便作为我使用的第 3 方库。我的问题是每次我通过控制台发送通知时,第 3 方都有一个像这样注册的广播接收器

    <receiver
        android:name=".ThirdPartyReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </receiver>

能够获取我所有通知的内容,我该如何防止这种情况? atm 我正在使用我的凭据初始化和使用 firebase 应用程序的实例,如下所示:

FirebaseOptions.Builder()
        .setApplicationId(id)
        .setApiKey(api)
        .setDatabaseUrl(databaseurl)
        .setGcmSenderId(senderId)
        .setProjectId(projectId)
        .build()

但是看起来 FCM 只依赖 packageName 来传递推送通知,并且我项目中包含的任何第三方库都可以注册以获取推送通知,有没有办法防止这种情况?

观察,手动禁用所有未知接收器可以防止这种情况发生,但是库不再收到通知,我破坏了它的功能。

【问题讨论】:

  • "能够获取我所有通知的内容,我该如何防止这种情况发生?"似乎与“然后图书馆不再收到通知并且我破坏了它的功能”相冲突。要么摆脱图书馆,要么使用图书馆(并接受图书馆需要访问您的通知以帮助您处理这些通知的事实)。
  • @CommonsWare 该库是应用程序的核心部分。他们有他们的 FCM 项目、管理和其他一切,他们的通知只对他们很重要,比如对讲机或 Zendesk 集成。我的应用程序有我自己的 FCM 项目,我需要我的通知。我试图阻止的是他们的接收者接收我的通知。我不想以编程方式强制/禁用它,因为它会破坏第三方功能。我认为 FCM FirebaseApp 应该以某种方式与 GCM 发送者绑定,并且只发送/通知正确的接收者。
  • 你有自己定义的类扩展FirebaseMessagingService吗?只是看看这是否会拦截他们进来。
  • 嗨@Silmarilos,我确实有自己定义的类扩展FirebaseMessagingService,扩展这个似乎工作得差不多了,但是图书馆注册的com.google.android.c2dm.intent.RECEIVE的接收器仍然能够得到我的通知内容,即使在其上注册另一个接收器。关于广播优先级,我仍然需要尝试 János 解决方案

标签: android firebase firebase-cloud-messaging


【解决方案1】:

我不确定 FCM 是否使用有序广播,但如果是,那么您必须:

  1. 更改BroadcastReveiver 的优先级(例如AndroidManifest.xml)和
  2. onReceive() 实现中调用abortBroadcast() 以防止任何其他广播接收器接收广播。

https://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()

也许对你有帮助。

【讨论】:

    【解决方案2】:

    我会这样做(未测试)

    1. 从应用清单中删除其他接收器。我认为这可以通过manifest mergertools:node="remove"策略来完成

      <receiver tools:node="remove"
          android:name=".ThirdPartyReceiver"
          android:exported="true"
          android:permission="com.google.android.c2dm.permission.SEND" />
      
    2. 让您自己的 FirebaseMessagingService 实现遵循代理模式,即如果您无法处理该消息,则调用 ThirdPartyReceiver

    【讨论】:

      【解决方案3】:

      这样做的一种方法是为您的接收器提供最高优先级(最大 1000)并使用 abortBroadcast(); 阻止它转发到下一个接收器,但您需要在 AndroidManifest.xml 中添加正确的权限

      上面的代码很快就会被绝对不要使用广播接收器。阅读下面的链接。

      https://developers.google.com/cloud-messaging/android/client

      现在您必须迁移到新机制。按照此链接进行迁移。

      https://developers.google.com/cloud-messaging/android/android-migrate-fcm

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多