我对如何以最优雅的方式恢复以前的完全控制(订阅和取消订阅FCM)进行了简要研究。在用户登录或注销后启用或禁用FCM。
第一步 - 防止自动初始化
现在Firebase处理InstanceID
和生成注册令牌所需的所有其他内容。首先,您需要防止自动初始化。根据官方设置文档,您需要将这些元数据值添加到您的AndroidManifest.xml
中:
<?xml version="1.0" encoding="utf-8"?>
<application>
<meta-data android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
<meta-data android:name="firebase_analytics_collection_enabled"
android:value="false" />
<service android:name=".FCMService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
</application>
现在您已经禁用了自动令牌请求过程。同时,您可以通过代码在运行时再次启用它。
步骤2. - 实现enableFCM()
和disableFCM()
函数
如果您再次启用自动初始化,则会立即收到一个新令牌,这是实现enableFCM()
方法的完美方式。
所有的订阅信息都分配给InstanceID,所以当您删除它时,就可以取消订阅所有主题。通过这种方式,您可以实现disableFCM()
方法,在删除之前只需关闭自动初始化即可。
public class FCMHandler {
public void enableFCM(){
FirebaseMessaging.getInstance().setAutoInitEnabled(true);
}
public void disableFCM(){
FirebaseMessaging.getInstance().setAutoInitEnabled(false);
new Thread(() -> {
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
第三步 - FCMService
实现 - 获取令牌和接收消息
在上一步中,您需要接收新的令牌并直接发送到您的服务器。另一方面,您将接收到数据消息,只需按照您的意愿处理即可。
public class FCMService extends FirebaseMessagingService {
@Override
public void onNewToken(String token) {
super.onNewToken(token);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
String from = remoteMessage.getFrom();
Map data = remoteMessage.getData();
if (data != null) {
sendMessageNotification(message, messageId);
}
}
private void sendMessageNotification(String msg, long messageId) {
}
}
我认为这个解决方案清晰、简单并且透明。我在生产环境中测试过,它很有效。希望对你有所帮助。