注销时调用FirebaseInstanceId.Instance.DeleteInstanceId()以停止Xamarin.Android中的FCM通知将引发异常

注销时调用FirebaseInstanceId.Instance.DeleteInstanceId()以停止Xamarin.Android中的FCM通知将引发异常,xamarin,xamarin.android,firebase-cloud-messaging,Xamarin,Xamarin.android,Firebase Cloud Messaging,我有一个Xamarin.Forms v4.4.0.991477应用程序,我在其中设置了Firebase推送通知。对于我使用的Xamarin.Android项目,Xamarin.Firebase.Messaging v71.1740.0包 在用户注销时,我调用 FirebaseInstanceId.Instance.DeleteInstanceId() 但它抛出了一个例外 Java.IO.IOException: MAIN_THREAD at Java.Interop.JniEnvironme

我有一个Xamarin.Forms v4.4.0.991477应用程序,我在其中设置了Firebase推送通知。对于我使用的Xamarin.Android项目,Xamarin.Firebase.Messaging v71.1740.0包

在用户注销时,我调用

FirebaseInstanceId.Instance.DeleteInstanceId()

但它抛出了一个例外

Java.IO.IOException: MAIN_THREAD
  at Java.Interop.JniEnvironment+InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0006e] in <af1c6fdcff1a4da4a0e44a8cdef352da>:0 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in <af1c6fdcff1a4da4a0e44a8cdef352da>:0 
  at Firebase.Iid.FirebaseInstanceId.DeleteInstanceId () [0x0000a] in <86531d1309d7458994f8292b9231bad1>:0 
  at MyDroid.Droid.PlatformFCM.Terminate () [0x00002] in /Volumes/MyDroid/Droid/PlatformFCM.cs:40 
  --- End of managed Java.IO.IOException stack trace ---
java.io.IOException: MAIN_THREAD
    at com.google.firebase.iid.FirebaseInstanceId.deleteInstanceId(Unknown Source:69)
    at crc64ee486da937c010f4.ButtonRenderer.n_onClick(Native Method)
    at crc64ee486da937c010f4.ButtonRenderer.onClick(ButtonRenderer.java:104)
    at android.view.View.performClick(View.java:6897)
    at android.widget.TextView.performClick(TextView.java:12693)
    at android.view.View$PerformClick.run(View.java:26101)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6944)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Java.IO.IOException:主线程
在Java.Interop.JniEnvironment+InstanceMethods.CallVoidMethod(Java.Interop.JniObjectReference实例,Java.Interop.JniMethodInfo方法,Java.Interop.JniArgumentValue*args)[0x0006e]中:0
在Java.Interop.jnipermembers+JniInstanceMethods.InvokeVirtualVoidMethod(System.String encodedMember,Java.Interop.IJavaPeerable self,Java.Interop.JniArgumentValue*参数)[0x0002a]中:0
在0中的Firebase.Iid.FirebaseInstanceId.DeleteInstanceId()[0x0000a]处
在/Volumes/MyDroid/Droid/PlatformFCM.cs:40中的MyDroid.Droid.PlatformFCM.Terminate()[0x00002]处
---托管Java.IO.IOException堆栈跟踪结束---
java.io.IOException:主线程
位于com.google.firebase.iid.FirebaseInstanceId.deleteInstanceId(未知来源:69)
在crc64ee486da937c010f4.ButtonRenderer.n_onClick处(本机方法)
在crc64ee486da937c010f4.ButtonRenderer.onClick(ButtonRenderer.java:104)
在android.view.view.performClick上(view.java:6897)
在android.widget.TextView.performClick上(TextView.java:12693)
在android.view.view$PerformClick.run(view.java:26101)
位于android.os.Handler.handleCallback(Handler.java:789)
位于android.os.Handler.dispatchMessage(Handler.java:98)
位于android.os.Looper.loop(Looper.java:164)
位于android.app.ActivityThread.main(ActivityThread.java:6944)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:327)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
而且代币似乎也没有过期。当我检查令牌时,我得到相同的令牌

如何删除FirebaseInstanceId使令牌过期?

调用

FirebaseInstanceId.Instance.DeleteInstanceId()

应该像这样在后台线程中调用

Task.Run(()=>{FirebaseInstanceId.Instance.DeleteInstanceId();})

因为它是一种阻塞服务。应该在
主线程上调用而不是

public voiddeleteInstanceId()

删除实例ID及其关联的数据

这将停止在生成实例ID时开始向Firebase后端定期发送数据,除非使用了另一个需要InstanceId的库(如FCM、RemoteConfig或Analytics)或将其配置为自动执行

如果启用Firebase Cloud Messaging auto init,则会异步生成新实例ID

这是一个阻塞函数,所以不要在主线程上调用它