OnTokenRefresh 从未在 Xamarin Android 中调用
Posted
技术标签:
【中文标题】OnTokenRefresh 从未在 Xamarin Android 中调用【英文标题】:OnTokenRefresh never called in Xamarin Android 【发布时间】:2017-10-16 12:56:40 【问题描述】:我正在尝试在我的 Xamarin android 项目中实现远程通知。我按照各种指南中的分步说明进行操作,但从未调用过 OnTokenRefresh
方法,即使是第一次,所以看起来我的应用程序没有收到任何类型的令牌,甚至没有进行任何类型的 firebase 注册.
-
我已将 Firebase 添加到我的 Android 应用并下载了
google-services.json
我在我的 Xamarin Android 项目中包含了 google-services.json
,并将 Build Action 设置为 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
?
【问题讨论】:
您是否正在获取unsuccessful
或 successful
FirebaseApp 初始化? ***.com/a/42159446/4984832
在 MainActivity 我执行:FirebaseApp.InitializeApp(this);
但它返回此 Java 异常:“Java.Lang.IllegalStateException:默认 FirebaseApp 未在此过程中初始化 您应该像这样在 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
【讨论】:
以上是关于OnTokenRefresh 从未在 Xamarin Android 中调用的主要内容,如果未能解决你的问题,请参考以下文章
实例ID服务是不是在应用升级时发起回调onTokenRefresh()?
FCM - onTokenRefresh() 永远不会被调用
Firebase FCM 强制 onTokenRefresh() 被调用
Firebase onTokenRefresh() 未被调用