Xamarin Forms Android端应用更新后FCM token无法生成问题咨询
Xamarin.Forms Android端FCM更新后无法获取令牌解决方案
问题根源
Android端OnTokenRefresh回调仅在令牌发生变更时触发,旧版本应用未集成FCM,更新到集成FCM的新版本不属于该回调的默认触发场景,因此不会自动生成并返回令牌。iOS端的DidReceiveRegistrationToken回调本身包含首次注册触发逻辑,因此不存在该问题。
解决方案
1. 应用启动时主动拉取FCM令牌(最稳妥方案)
该方案可覆盖首次安装、应用更新等所有场景,不需要依赖系统回调触发。在Android项目的主ActivityOnCreate方法或自定义Application类的OnCreate方法中添加如下逻辑:
using Firebase.Messaging; using Android.Gms.Tasks; // 应用启动时主动调用拉取令牌 FirebaseMessaging.Instance.GetToken().AddOnCompleteListener(new OnTokenFetchListener()); // 实现拉取完成回调 public class OnTokenFetchListener : Java.Lang.Object, IOnCompleteListener { public void OnComplete(Task task) { if (task.IsSuccessful && task.Result != null) { string fcmToken = task.Result.ToString(); // 复用原有`FirebaseRegistrationService`中的令牌存储、上传到业务服务器的逻辑即可 ProcessFcmToken(fcmToken); } } }
该逻辑仅需在Android端实现,iOS端原有触发逻辑无需改动
2. 按版本号触发减少重复调用
如果不需要每次应用启动都执行拉取操作,可以添加版本校验逻辑,仅在应用更新后首次启动时执行一次拉取:
- 用本地存储(如
SharedPreferences)记录上一次运行的应用版本号 - 应用启动时对比当前应用版本号与存储的版本号
- 若版本号不一致,执行一次令牌主动拉取,拉取成功后更新存储的版本号
注意事项
- 不要将
OnTokenRefresh作为唯一的令牌获取入口,它的设计定位是令牌更新时的通知回调,而非首次获取令牌的触发入口 - 主动拉取逻辑可以和原有
OnTokenRefresh逻辑共存,后续令牌过期更新时OnTokenRefresh仍然会正常触发,不会出现逻辑冲突 - 该方案已覆盖无FCM集成的旧版本更新到有FCM集成的新版本的场景,用户无需卸载重装即可正常获取推送令牌
内容的提问来源于stack exchange,提问作者Sreejith Sree
相关产品推荐
相关产品推荐

