使用Xamarin Forms/Firebase Messaging及Azure通知中心时OnTokenRefresh()不触发
针对Azure Notification Hubs + Firebase 集成的问题解决方案
我来帮你排查这两个常见的集成问题,这些坑我之前也踩过,一步步来解决:
一、原生Android端问题(FirebaseIIDService OnTokenRefresh不触发 + MainActivity Intent.Extras为空)
1. 先确认FirebaseIIDService的清单配置正确性
你提到类名和示例不同(比如用FirebaseIIDService而非MyFirebaseIIDService),这时候清单里的Service标签必须严格匹配你的类全名,不能照搬示例的配置。正确的清单配置应该是这样的:
<service android:name=".FirebaseIIDService" <!-- 这里要和你的类名完全一致,包含包名前缀 --> android:exported="false"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service>
注意:如果你的类不在默认包下,要写全路径,比如com.yourcompany.yourapp.FirebaseIIDService
2. OnTokenRefresh不触发的核心原因与解决
OnTokenRefresh()只会在首次安装应用、Token过期/变更、清除应用数据这几种场景下触发,如果Firebase已经缓存了有效Token,它不会主动触发。你可以通过以下方式测试:
- 手动获取Token验证:在
MainActivity.OnCreate()里添加代码获取Token,确认Token是否存在:String token = FirebaseInstanceId.getInstance().getToken(); Log.d("FirebaseToken", "Current Token: " + token); - 如果能拿到Token,说明集成没问题,只是没触发刷新:卸载重装应用或者清除应用数据,就能触发
OnTokenRefresh()。 - 另外提一句:FirebaseInstanceIdService已经被官方弃用,推荐使用
FirebaseMessagingService重写onNewToken()方法,兼容性更好。
3. MainActivity Intent.Extras为空的解决
这个问题和推送消息的类型以及应用启动模式有关:
- 如果是通知类型的推送(payload包含
notification字段):点击通知启动应用时,Extras不会直接传入OnCreate()的Intent,而是需要在OnNewIntent()方法中获取(前提是你的Activity启动模式设置为singleTop或singleTask):@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Bundle extras = intent.getExtras(); if (extras != null) { // 处理推送数据 } } - 如果是数据类型的推送(payload只有
data字段):Extras会直接传入OnCreate()的Intent,但要确保Azure Notification Hubs的推送payload配置了data字段。
二、Xamarin Forms + Firebase Messaging 集成的OnTokenRefresh不触发问题
1. 确认NuGet包与配置的一致性
- 确保
Xamarin.Firebase.Messaging、Xamarin.GooglePlayServices.Base等相关包的版本完全一致,避免版本冲突导致的初始化失败。 - 检查
google-services.json是否正确放置在Android项目的根目录,并且Build Action设置为GoogleServicesJson(右键文件 -> 属性 -> Build Action)。
2. 正确配置Firebase服务类
在Xamarin Forms的Android项目中,自定义Firebase服务类时,要使用[Service]特性指定正确的类名,避免清单自动生成错误:
[Service(Name = "com.yourcompany.yourapp.MyFirebaseIIDService")] [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })] public class MyFirebaseIIDService : FirebaseInstanceIdService { public override void OnTokenRefresh() { var refreshedToken = FirebaseInstanceId.Instance.Token; // 将Token上传到Azure Notification Hubs SendTokenToAzure(refreshedToken); } }
注意:Name属性要写全路径,避免Xamarin自动生成的md5前缀类名导致的匹配失败
3. 手动触发Token获取与验证
如果OnTokenRefresh()没触发,同样可以手动获取Token来验证集成是否正常:
在Android项目的MainActivity.OnCreate()中添加:
var token = FirebaseInstanceId.Instance.Token; if (!string.IsNullOrEmpty(token)) { // 上传Token到Azure }
或者使用最新的FirebaseMessaging API:
var token = await FirebaseMessaging.Instance.GetTokenAsync();
4. 确保Firebase初始化正确
在Android项目的MainActivity.OnCreate()中,务必先初始化Firebase:
base.OnCreate(savedInstanceState); FirebaseApp.InitializeApp(this); // 这一步不能少 Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App());
内容的提问来源于stack exchange,提问作者HelluvaEngineer
相关产品推荐
相关产品推荐

