当我使用Google Firebase推送通知时,我想将实例令牌保存到SharedPreferences
。不幸的是,每当令牌刷新并想要从SharedPreferences
检查前一个令牌时,它们都是空的......
是因为我在这里使用Service
吗?
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#但不应该有任何区别。
答案 0 :(得分:0)
我不知道它在xamarin中是如何工作的,但是在服务上下文的本机android getSharedPreferences中可能是错误的。打开共享首选项时,您应该只使用applicationContext或MODE_MULTI_PROCESS。
您可以看到类似的问题here。
当你打开一些文件时,Xamarin和C#也有这种模式,所以我认为与首选项完全相同。试试这样的,而不是使用GetDefaultSharedPreferences:
ISharedPreferences prefs = Application.Context.GetSharedPreferences ("PREF_NAME", FileCreationMode.MultiProcess);
答案 1 :(得分:0)
您是否卸载了应用以刷新令牌?如果是,我认为您无法获得旧令牌,因为卸载应用时SharedPreferences
已被清除。
我尝试过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);
}
首次安装应用时,您将获得令牌并将其保存在SharedPreferences
,下次打开应用并在文本视图中显示旧令牌,然后您就会发现您的令牌已保存,并且不要卸载您的应用程序:
TextView tv1 = (TextView)findViewById(R.id.tv1);
SharedPreferences mSharedPreferences = getSharedPreferences("hello",0);
String oldToken = mSharedPreferences.getString("Token",null);
tv1.setText(oldToken);
答案 2 :(得分:0)
我解决了问题,事实证明,我的代码工作正常但在我的测试设备上表现得很奇怪。
重新构建应用程序后,SharedPreferences
已被清除,尽管我在Visual Studio中检查了部署选项之间的 Preserve应用程序数据/缓存。那是因为我的物理测试设备是 rooted ,并且不接受此选项。
尝试使用无根设备时,一切都按预期工作。