我的应用程序像我使用的第三方库一样实现FCM。我的问题是,每次我通过控制台发送通知时,第三方都有像这样注册的广播接收器
<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来发出推送通知,并且我项目中包含的任何第三方库可以注册以获取推送通知,有没有办法防止此?
观察,手动禁用所有未知接收器会阻止这种情况,但是库不再收到通知,我打破了其功能。
我不确定FCM是否使用有序广播,但是如果这样做,则必须:
- 更改
BroadcastReveiver
的优先级(例如在AndroidManifest.xml
中(和 - 在
onReceive()
实施中致电abortBroadcast()
,以防止其他广播接收器接收广播。
https://developer.android.com/reference/android/content/broadcastreceiver.html#abortbroadcast((
它可能会帮助您。
这就是我要做的(未测试(
-
从应用清单中删除其他接收器。我认为这可以通过
来完成tools:node="remove"
的示范合并策略<receiver tools:node="remove" android:name=".ThirdPartyReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" />
-
使您自己的
FirebaseMessagingService
实现遵循代理模式,即调用ThirdPartyReceiver
如果不是消息,则可以处理。
一种做法的方法是给您的接收器最高优先级(最大1000(,并使用abortBroadcast();
阻止其转发到下一个接收器,但是您需要在AndroidManifest.xml <</p>
上面的代码将是绝对的,很快就不会使用广播接收器。阅读Bellow链接。
https://developers.google.com/cloud-messaging/android/client
现在您必须迁移到新机制。请按照此链接进行迁移。
https://developers.google.com/cloud-messaging/android/android-migrate-migrate-fcm