我的应用正在实施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来传递推送通知,并且我项目中包含的任何第三方库都可以注册以获得推送通知,有没有办法防止这种情况发生?
观察,手动禁用所有未知的接收器可以防止这种情况,但是随后库不再收到通知,因此我破坏了其功能。
答案 0 :(得分:3)
我不确定FCM是否使用有序广播,但如果这样做,则您必须:
BroadcastReveiver
的优先级(例如在AndroidManifest.xml
中)和abortBroadcast()
实现中呼叫onReceive()
,以防止任何其他广播接收者接收广播。https://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()
这可能会对您有所帮助。
答案 1 :(得分:2)
这就是我要做的(未经测试)
从应用清单中删除其他接收者。我认为这可以通过manifest merger
的tools:node="remove"
策略来完成
<receiver tools:node="remove"
android:name=".ThirdPartyReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" />
使自己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