You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:00:58