You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:08:18