我进行了简短的研究,以了解哪种最优雅的解决方案可以像以前一样恢复完全控制权(订阅和取消订阅FCM)。用户登录或注销后启用和禁用FCM。
步骤1.-防止自动初始化
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();
}
}
步骤3.-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) {
}
}
我认为这种解决方案是清晰,简单和透明的。我在生产环境中进行了测试,并且可以正常工作。希望对您有所帮助。