重启Xamarin.Forms应用后Parse的GetCurrentUser()返回null问题求助
解决Parse-SDK.dotNET 2.0.0-develop-1在Xamarin.Forms中重启后User与Installation持久化丢失问题
问题背景
使用Parse-SDK.dotNET 2.0.0-develop-1开发Xamarin.Forms应用时,SDK无法在应用重启后将User和ParseInstallation对象持久化到本地磁盘:
- 登录状态下重启应用,
GetCurrentUser()返回null - 每次重启都会创建新的
ParseInstallation对象
自行通过保存SessionToken并调用await ParseClient.Instance.BecomeAsync(sessionToken).ConfigureAwait(false)可恢复用户,但ParseInstallation的持久化问题尚未解决,且旧版SDK存在Xamarin.Forms兼容性问题。
可行解决方案
1. 完善User持久化流程
使用Xamarin.Essentials的SecureStorage安全存储SessionToken,避免明文存储:
// 登录成功后保存SessionToken var currentUser = ParseUser.CurrentUser; if (currentUser != null) { await SecureStorage.SetAsync("Parse_SessionToken", currentUser.SessionToken).ConfigureAwait(false); } // 应用重启初始化ParseClient后恢复用户 var savedToken = await SecureStorage.GetAsync("Parse_SessionToken").ConfigureAwait(false); if (!string.IsNullOrEmpty(savedToken)) { try { await ParseClient.Instance.BecomeAsync(savedToken).ConfigureAwait(false); } catch (ParseException ex) { // 处理token失效或其他异常,比如引导重新登录 } }
2. ParseInstallation持久化方案
通过保存ParseInstallation的ObjectId和设备标识,重启后主动查询并复用现有Installation:
// 初始化ParseClient后,处理Installation恢复 var savedInstallationId = Preferences.Get("Parse_InstallationObjectId", string.Empty); var deviceId = DeviceInfo.Id; // 用设备唯一标识辅助查询 if (!string.IsNullOrEmpty(savedInstallationId)) { try { var query = ParseInstallation.Query.WhereEqualTo("objectId", savedInstallationId); var existingInstallation = await query.FirstOrDefaultAsync().ConfigureAwait(false); if (existingInstallation != null) { // 替换当前Installation实例 typeof(ParseInstallation).GetProperty("CurrentInstallation", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic) ?.SetValue(null, existingInstallation); } } catch (ParseException ex) { // 查询失败,允许SDK创建新Installation } } // 确保新创建的Installation信息被保存 var currentInstallation = ParseInstallation.CurrentInstallation; if (currentInstallation != null && string.IsNullOrEmpty(Preferences.Get("Parse_InstallationObjectId", string.Empty))) { await currentInstallation.SaveAsync().ConfigureAwait(false); Preferences.Set("Parse_InstallationObjectId", currentInstallation.ObjectId); }
3. 旧版SDK兼容尝试
若要使用旧版SDK,可尝试Parse-SDK.dotNET 1.7.0版本,调整初始化代码适配Xamarin.Forms:
// 旧版初始化方式 ParseClient.Initialize(new ParseClient.Configuration { ApplicationId = "Application_ID", Server = "Server_URL", WindowsKey = "NET_KEY" }); // 针对Xamarin.Forms平台设置环境信息 ParseClient.Instance.Configuration.Android.Key = "ANDROID_KEY"; // 按需添加平台密钥 ParseClient.Instance.Configuration.iOS.Key = "IOS_KEY";
注意旧版可能需要额外处理平台特定的权限和依赖,需确保项目引用匹配。
内容的提问来源于stack exchange,提问作者user3510729
相关产品推荐
相关产品推荐

