OnTokenRefresh从未在Xamarin Android中调用过

时间:2017-10-16 12:56:40

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

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

  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
        }
    }
    
  5. 正如我已经说过OnTokenRefresh从未被调用过。 我无法理解的是:Firebase注册谁接收有效令牌? 有缺失的指令吗? 是否有丢失的方法进行此注册? 为什么永远不会调用OnTokenRefresh

4 个答案:

答案 0 :(得分:3)

您应该在Activity中启动服务,如下所示:

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

同样清理解决方案一次并再次运行应用程序。 xamarin的firebase中存在一个错误。

答案 1 :(得分:2)

根据this document,(请参阅标题为:实施Firebase实例ID服务的部分)仅在以下几种情况下调用OnTokenRefresh:

  • 安装或卸载应用程序时。
  • 当用户删除应用数据时。
  • 当应用程序删除实例ID时。
  • 当令牌的安全性受到损害时。

要触发OnTokenRefresh,您应首先从设备中卸载该应用。然后,当您重新安装应用程序并首次打开它时,将调用OnTokenRefresh。

答案 2 :(得分:0)

您可以通过禁用

来避免每次清洗溶液

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

工具->选项-> Xamarin-> Android设置

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

答案 3 :(得分:0)

如果您使用的是模拟器,请确保安装google应用,因为它取决于设备中是否存在google play服务包

如果您使用的是Genymotion,则可以按install Gapps enter image description here