阻止第三方图书馆获取我的推送通知

时间:2019-05-17 11:18:01

标签: android firebase firebase-cloud-messaging

我的应用正在实施FCM,因此是我使用的第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来传递推送通知,并且我项目中包含的任何第三方库都可以注册以获得推送通知,有没有办法防止这种情况发生?

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

3 个答案:

答案 0 :(得分:3)

我不确定FCM是否使用有序广播,但如果这样做,则您必须:

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

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

这可能会对您有所帮助。

答案 1 :(得分:2)

这就是我要做的(未经测试)

  1. 从应用清单中删除其他接收者。我认为这可以通过manifest merger

    tools:node="remove"策略来完成
    <receiver tools:node="remove"
        android:name=".ThirdPartyReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" />
    
  2. 使自己FirebaseMessagingService的实现遵循代理模式,即如果不是可以处理的消息,则调用ThirdPartyReceiver

答案 2 :(得分:0)

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

以上代码将是绝对的,不要使用广播接收器。阅读波纹管链接。

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

现在,您必须迁移到新机制。单击此链接进行迁移。

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