Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Xamarin Android中从未调用过OnTokenRefresh_Android_Firebase_Xamarin_Push Notification_Xamarin.android - Fatal编程技术网

在Xamarin Android中从未调用过OnTokenRefresh

在Xamarin Android中从未调用过OnTokenRefresh,android,firebase,xamarin,push-notification,xamarin.android,Android,Firebase,Xamarin,Push Notification,Xamarin.android,我正试图在我的XamarinAndroid项目中实现远程通知。我遵循了各种指南中的逐步说明,但从未调用过OnTokenRefresh方法,即使是第一次,因此我的应用程序似乎没有收到任何类型的令牌,甚至没有进行任何类型的firebase注册 我已将Firebase添加到我的Android应用程序中,并下载了google services.json 我在Xamarin Android项目中包含了google services.json,并将构建操作设置为GoogleServicesJson 我在An

我正试图在我的XamarinAndroid项目中实现远程通知。我遵循了各种指南中的逐步说明,但从未调用过
OnTokenRefresh
方法,即使是第一次,因此我的应用程序似乎没有收到任何类型的令牌,甚至没有进行任何类型的firebase注册

  • 我已将Firebase添加到我的Android应用程序中,并下载了
    google services.json
  • 我在Xamarin Android项目中包含了
    google services.json
    ,并将构建操作设置为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>
    
  • 正如我已经说过的,
    OnTokenRefresh
    从未被调用。 我无法理解的是:Firebase注册是为了让谁获得有效令牌? 是否缺少指令? 是否缺少进行此注册的方法? 为什么从不调用
    OnTokenRefresh

    根据(请参阅标题为:实现Firebase实例ID服务的部分)OnTokenRefresh仅在少数情况下调用:

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

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

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

    var intent=新的intent(这个,类型为(FirebaseRegistrationService));
    StartService(意向)


    另外,请清洁解决方案一次,然后再次运行应用程序。firebase for xamarin中存在一个bug。

    您可以通过禁用该选项来避免每次清洗该解决方案

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

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


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

    如果您使用的是emulator,请确保安装google应用程序,因为它取决于设备中存在的google play services软件包


    如果您使用的是Genymotion,您可以按install Gapps

    您是否获得
    不成功
    成功
    FirebaseApp初始化?在MainActivity中,我执行:
    FirebaseApp.InitializeApp(this)但它返回此Java异常:“Java.Lang.IllegalStateException:默认FirebaseApp在此过程中未初始化。请确保调用Firebase…”我已解决了清理解决方案的问题。难以置信。我发现卸载应用程序和清理解决方案对我来说是可行的。遇到此问题的任何人,请尝试“清理”解决方案,包括从项目中手动删除\obj\debug或\obj\release文件夹。这是否仍然是一个需要按所述启动活动的错误?或者在随后的Xamarin.Android更新中已经修复了这个问题?在我写这篇文章时的个人测试中,我不需要执行上述代码,但是知道是否仍然需要解决方法对以后搜索这个主题会有帮助。我认为你不必每次都手动启动服务。它是自动发生的。xamarin中的FCM存在一个错误,当您卸载应用程序、删除bin和debug文件夹并重建应用程序时,该错误将得到解决
    
    [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
        }
    }