OnTokenRefresh 从未在 Xamarin Android 中调用

Posted

技术标签:

【中文标题】OnTokenRefresh 从未在 Xamarin Android 中调用【英文标题】:OnTokenRefresh never called in Xamarin Android 【发布时间】:2017-10-16 12:56:40 【问题描述】:

我正在尝试在我的 Xamarin android 项目中实现远程通知。我按照各种指南中的分步说明进行操作,但从未调用过 OnTokenRefresh 方法,即使是第一次,所以看起来我的应用程序没有收到任何类型的令牌,甚至没有进行任何类型的 firebase 注册.

    我已将 Firebase 添加到我的 Android 应用并下载了 google-services.json 我在我的 Xamarin Android 项目中包含了 google-services.json,并将 Build Action 设置为 GoogleServicesJson

    我将此代码插入AndroidManifest.xml

    <receiver 
    android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" 
    android:exported="false" />
    <receiver 
    android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" 
    android:exported="true" 
    android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="$applicationId" />
        </intent-filter>
    </receiver>
    

    我创建了一个扩展 FirebaseInstanceIdService 的类

    [Service]
    [IntentFilter(new[]  "com.google.firebase.INSTANCE_ID_EVENT" )]
    class FirebaseRegistrationService : FirebaseInstanceIdService
    
    const string TAG = "FirebaseRegistrationService";
    
        public override void OnTokenRefresh()
        
            var refreshedToken = FirebaseInstanceId.Instance.Token;
            System.Diagnostics.Debug.WriteLine(TAG, "Refreshed token: " + refreshedToken);
    
            MainActivity.CurrentActivity.RunOnUiThread(() => RegisterDeviceOnServer(refreshedToken));
        
    
        public void RegisterDeviceOnServer(string refreshedToken)
        
            // Custom implementation
        
    
    

正如我已经说过的,OnTokenRefresh 永远不会被调用。 我无法理解的是:Firebase 注册谁来接收有效令牌? 是否缺少指令? 是否存在进行此注册的缺失方法? 为什么永远不会调用OnTokenRefresh

【问题讨论】:

您是否正在获取 unsuccessfulsuccessful FirebaseApp 初始化? ***.com/a/42159446/4984832 在 MainActivity 我执行:FirebaseApp.InitializeApp(this); 但它返回此 Java 异常:“Java.Lang.IllegalStateException:默认 FirebaseApp 未在此过程中初始化 。确保调用 Firebase...” 我已经解决了制作清洁解决方案的问题。难以置信。 我发现卸载应用程序并清理解决方案对我有用。 遇到这个问题的人,请尝试“清理”解决方案,这涉及手动删除项目中的 \obj\debug 或 \obj\release 文件夹。 【参考方案1】:

您应该像这样在 Activity 中启动服务:

var intent = new Intent(this, typeof(FirebaseRegistrationService)); StartService(intent);

还要清理一次解决方案并再次运行应用程序。 xamarin 的 firebase 中有一个错误。

【讨论】:

这仍然是一个需要按照描述启动活动的错误吗?还是在后续的 Xamarin.Android 更新中已修复此问题?在撰写本文时,在我的个人测试中,我不需要执行上述代码,但它有助于将来对该主题的搜索了解是否仍需要解决方法。 我认为您不必每次都手动启动该服务。它自动发生。 xamarin 中的 FCM 存在一个错误,当您卸载应用程序、删除 bin 和调试文件夹并重建您的应用程序时,该错误将得到解决【参考方案2】:

根据this document,(参见标题为:实施 Firebase 实例 ID 服务的部分)仅在少数情况下调用 OnTokenRefresh:

安装或卸载应用时。 当用户删除应用数据时。 当应用删除实例 ID 时。 当令牌的安全性受到威胁时。

为了触发 OnTokenRefresh,您应该首先从设备上卸载应用程序。那么当你重新安装应用并第一次打开它时,会调用 OnTokenRefresh。

【讨论】:

【参考方案3】:

您可以通过禁用来避免每次都清理解决方案

在部署之间保留设备上的应用程序数据缓存

VS2017 Enterprise 中的工具 -> 选项 -> Xamarin -> Android 设置

这使得 OnTokenRefresh 在每次重新部署后都会被调用。

【讨论】:

【参考方案4】:

如果您使用的是模拟器,请确保安装谷歌应用程序,因为它取决于您设备中存在的谷歌播放服务包

如果您使用 Genymotion,可以按安装 Gapps

【讨论】:

以上是关于OnTokenRefresh 从未在 Xamarin Android 中调用的主要内容,如果未能解决你的问题,请参考以下文章

实例ID服务是不是在应用升级时发起回调onTokenRefresh()?

FCM - onTokenRefresh() 永远不会被调用

Firebase FCM 强制 onTokenRefresh() 被调用

Firebase onTokenRefresh() 未被调用

未调用MyFirebaseInstanceIDService“onTokenRefresh”

使用firebase推送通知中的onTokenRefresh与getToken有啥区别?