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

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

  1. 我已将 Firebase 添加到我的 Android 应用并下载了 google-services.json
  2. 我在我的 Xamarin Android 项目中包含了 google-services.json,并将 Build Action 设置为 GoogleServicesJson
  3. 我将此代码插入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>
    
  4. 我创建了一个扩展 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 初始化? stackoverflow.com/a/42159446/4984832
  • 在 MainActivity 我执行:FirebaseApp.InitializeApp(this); 但它返回此 Java 异常:“Java.Lang.IllegalStateException:默认 FirebaseApp 未在此过程中初始化 。确保调用 Firebase...”
  • 我已经解决了制作清洁解决方案的问题。难以置信。
  • 我发现卸载应用程序并清理解决方案对我有用。
  • 遇到这个问题的人,请尝试“清理”解决方案,这涉及手动删除项目中的 \obj\debug 或 \obj\release 文件夹。

标签: android firebase xamarin push-notification xamarin.android


【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多