Firebase 重新启动服务/设备后SharedReferences为空
当我使用Google Firebase进行推送通知时,我想将实例令牌保存到Firebase 重新启动服务/设备后SharedReferences为空,firebase,service,xamarin.android,sharedpreferences,firebase-cloud-messaging,Firebase,Service,Xamarin.android,Sharedpreferences,Firebase Cloud Messaging,当我使用Google Firebase进行推送通知时,我想将实例令牌保存到SharedReferences。不幸的是,每当令牌刷新并希望从SharedReferences检查上一个令牌时,它们都是空的 是因为我在这里使用服务吗 public class MyFirebaseIIDService : FirebaseInstanceIdService { public override void OnTokenRefresh() { var sharedPrefer
SharedReferences
。不幸的是,每当令牌刷新并希望从SharedReferences
检查上一个令牌时,它们都是空的
是因为我在这里使用服务吗
public class MyFirebaseIIDService : FirebaseInstanceIdService
{
public override void OnTokenRefresh()
{
var sharedPreferences = PreferenceManager.GetDefaultSharedPreferences(this);
var sharedPreferencesEditor = sharedPreferences.Edit();
// Get Firebase Instance Token
var refreshedToken = FirebaseInstanceId.Instance.Token;
// Check if a Firebase Instance Token has been registered before and unregister it
var oldToken = sharedPreferences.GetString("FirebaseInstanceToken", null);
if (oldToken != null) // is ALWAYS null :(
{
// Unregister old token...
}
// Save the Firebase Instance Token locally
sharedPreferencesEditor.PutString("FirebaseInstanceToken", refreshedToken);
sharedPreferencesEditor.Apply();
// At this point, the SharedPreferences have to token saved.
// Next time, the app reaches this point, it is gone...
}
}
很抱歉语法混乱,我使用Xamarin,所以这是C#,但它不会有任何区别。我不知道它在Xamarin中如何工作,但在本机android GetSharedReferences中,来自服务上下文的引用可能是错误的。打开共享首选项时,应仅使用applicationContext或MODE_MULTI_进程
你们可以看到类似的问题
Xamarin和C#在打开某个文件时也有这种模式,所以我认为与首选项完全相同。尝试以下方法,而不是使用GetDefaultSharedReferences:
ISharedPreferences prefs = Application.Context.GetSharedPreferences ("PREF_NAME", FileCreationMode.MultiProcess);
您是否卸载应用程序以刷新令牌?如果是,我认为您无法获得旧令牌,因为卸载应用程序时,SharedReferences
被清除
我已尝试使用java代码保存令牌:
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("Mike", "Refreshed token: " + refreshedToken);
SharedPreferences mSharedPreferences = getSharedPreferences("hello",0);
String oldToken = mSharedPreferences.getString("Token",null);
if(oldToken == null)
{
Log.d("Mike", "oldToken: " + null);
}
SharedPreferences.Editor mEditor = mSharedPreferences.edit();
mEditor.putString("Token", refreshedToken);
mEditor.commit();
// TODO: Implement this method to send any registration to your app's servers.
//sendRegistrationToServer(refreshedToken);
}
第一次安装应用程序时,您将获得令牌并将其保存在SharedReferences
中,下次打开应用程序并在文本视图中显示旧令牌时,您可以发现您的令牌已保存,并且不卸载应用程序:
TextView tv1 = (TextView)findViewById(R.id.tv1);
SharedPreferences mSharedPreferences = getSharedPreferences("hello",0);
String oldToken = mSharedPreferences.getString("Token",null);
tv1.setText(oldToken);
它起作用了。但是当你卸载你的应用程序时,textview
显示为空。我解决了这个问题,结果证明,我的代码工作正常,但在我的测试设备上表现异常
重新构建应用程序后,SharedReferences
已被清除,尽管我在Visual Studio中选中了在部署之间在设备上保留应用程序数据/缓存选项。这是因为我的物理测试设备是根植的,不接受这个选项
在无根设备上进行测试时,一切正常。Xamarin是1:1 C#to Java映射,因此Java Android中存在的一切都存在于Xamarin中。不幸的是,您提出的解决方案没有达到目的。仍然为空,在应用程序重新启动后…是的,我确实卸载并重新安装应用程序以刷新令牌,但Visual Studio有一个在部署之间保留应用程序数据/cahce设备选项,我已激活该选项。但是:我解决了这个问题。我测试的物理设备是根设备,因此此选项不起作用。用一部没有插脚的手机试过,效果很好。