我在我们的Xamarin Android应用中实施了Firebase消息传递。应用程序第一次运行时,它将OnTokenRefresh()称为例外。我卸载了应用程序并重新运行了重新安装应用程序的调试程序。但这次没有调用OnTokenRefresh。事实上,我无法让它被第二次称为单个设备。
我尝试使用令牌服务来获取令牌,但它总是抛出异常。方法很简单:
[assembly:
Xamarin.Forms.Dependency(typeof(MyApp.Droid.Services.NotificationToken))]
namespace MyApp.Droid.Services
{
class NotificationToken : INotificationToken
{
public string GetToken()
{
var token = "";
if (Firebase.Iid.FirebaseInstanceId.Instance != null)
token = Firebase.Iid.FirebaseInstanceId.Instance.Token;
return token;
}
}
}
如果Instance为null,则在检查时抛出异常。
[GoogleAccountDataServiceImpl] getToken() -> BAD_AUTHENTICATION. Account: <ELLIDED:-119322310>, App: com.google.android.gms, Service: oauth2:https://www.googleapis.com/auth/gcm
在创建主要活动后,我正在调用该服务。在用户登录我们的应用程序后调用它。
我的Android项目中包含了google-services.json。我很确定它是在安装应用程序的初始时间使用的,它创建了令牌并调用了OnTokenRefresh。
[Service]
[IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
public class MyFirebaseIIDService : FirebaseInstanceIdService
{
const string TAG = "MyFirebaseIIDService";
public override void OnCreate()
{
base.OnCreate();
//FirebaseInstanceId.Instance.GetToken();
}
public override void OnTokenRefresh()
{
var refreshedToken = FirebaseInstanceId.Instance.Token;
App.NotificationToken.Token = refreshedToken;
Log.Debug(TAG, "Refreshed token: " + refreshedToken);
}
}
在Visual Studio 2017中,您可以禁用以下首选项,以确保在部署到设备之间刷新Firebase令牌。这是通过反复试验获得的。
工具>选项> Xamarin> Android>在部署之间保留应用程序数据/缓存
希望这可以帮助。