OnTokenRefresh从未在Xamarin中调用过Android
问题描述:
我试图在Xamarin Android项目中实现远程通知。我遵循各种指南中的逐步指导,但从未调用过OnTokenRefresh
方法,即使是第一次,所以它看起来像我的应用程序没有收到任何类型的令牌,甚至没有进行任何类型的Firebase注册。OnTokenRefresh从未在Xamarin中调用过Android
- 我已经加入火力地堡到我的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>
插入这段代码
-
我创建了一个扩展类
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
永远不会被叫?
答
根据this document,(见标题为:实施火力地堡实例ID服务)OnTokenRefresh只在少数情况下称为:
- 当应用程序被安装或卸载。
- 当用户删除应用程序数据。
- 当应用程序擦除实例ID时。
- 当令牌的安全性受到影响时。
为了触发OnTokenRefresh,您应该先从设备上卸载应用程序。然后,当您重新安装应用程序并首次打开它时,OnTokenRefresh将被调用。
答
您应该启动该服务在您的活动是这样的:
var intent = new Intent(this, typeof(FirebaseRegistrationService)); StartService(intent);
同时清洁液一次,然后再次运行该应用程序。 Xamarin在firebase中存在一个错误。
您是否获得'不成功'或'成功'的FirebaseApp初始化? https://stackoverflow.com/a/42159446/4984832 – SushiHangover
在MainActivity中执行:'FirebaseApp.InitializeApp(this);'但它返回此Java异常:“Java.Lang.IllegalStateException:在此过程中未初始化FirebaseApp。确保调用Firebase ...“ –
我已经解决了清理解决方案的问题。难以置信。 –