For the complete documentation index, see llms.txt. This page is also available as Markdown.

自定义持久化提供程序

通过实现 IKeyValueStore 或 IPersistenceProvider,将 PlayerPrefs 会话存储替换为云后端、加密文件存储或内存实现。

Convai Unity SDK 将会话数据——连接状态、会话 ID、恢复令牌以及编辑器端最终用户 GUID——存储在 PlayerPrefs 默认通过 PlayerPrefsKeyValueStore。如果 PlayerPrefs 如果这适合您的部署,您就不需要本页。若您需要云端保存、加密存储、服务端会话管理,或用于自动化测试和 CI 的隔离存储,请替换持久化提供器。

SDK 写入存储的内容

键前缀
内容
重要性

convai.session.*

会话 ID 和恢复令牌

允许 SDK 在不重启 AI 回合的情况下恢复断开的会话

convai.end_user_id

仅限编辑器的设备 GUID(回退)

由……使用 DeviceEndUserIdProvider 在 Unity 编辑器中,当硬件 ID 不可用时

convai.prefs.*

用户偏好(例如静音状态)

在应用启动之间持久化 SDK 级设置

替换持久化提供器也就替换了这些内容的读写位置。你的实现必须处理 SDK 涉及的每个键——下面的适配器模式可确保不会遗漏任何内容。

持久化接口

IKeyValueStore——简单存储

namespace Convai.Domain.Abstractions
{
    public interface IKeyValueStore
    {
        string GetString(string key, string defaultValue = null);
        void   SetString(string key, string value);
        bool   HasKey(string key);
        void   DeleteKey(string key);
        void   Save();
    }
}

Save() 在写入操作后调用。对于内存存储而言它是无操作;对于基于文件的存储,它会刷新到磁盘。请在不需要异步操作的本地存储场景中实现此接口。

IPersistenceProvider——完整功能存储

builder.UsePersistence() 接受 IPersistenceProvider. 如果你的实现是 IKeyValueStore,请将其包装在适配器中(见 适配器模式 下文)。异步操作(SyncAsync, SaveVersionedAsync)如果你的后端是同步的,可以返回占位结果。

应实现哪个接口:

场景
实现

本地文件、加密 SQLite、内存

IKeyValueStore

云端保存、服务端存储、多设备同步

IPersistenceProvider

现有 IKeyValueStore 并在其上添加云同步

两者都要——将同步/版本化操作委托给云客户端

支持类型

PersistenceResult

成员
类型
说明

Success

bool

操作是否成功。

错误消息

string

错误描述,如果 Successfalse.

时间戳

DateTime

操作完成时的时间。

版本

long

操作后的版本号(适用于版本化操作)。

PersistenceResult.Succeeded(version)

static

创建成功结果。

PersistenceResult.Failed(error)

static

创建失败结果。

ConflictResolutionStrategy

由……使用 SaveVersionedAsync 用于在异步/云场景中解决写入冲突。

行为

LastWriteWins

基于时间戳,最近写入的值获胜。

HighestVersionWins

版本号更高的值获胜。

LocalWins

本地数据始终覆盖远程数据。

RemoteWins

远程数据始终覆盖本地数据。

Manual

向调用方返回冲突信息,以便显式解决。

PersistenceOptions

实现示例

内存存储(测试 / CI)

适用于自动化测试和 CI 运行,在这些场景下,运行之间的持久状态会破坏结果。

加密文件存储

满足禁止明文的合规要求 PlayerPrefs 用于会话数据。

调用 Save() 在每次写入后,或定期刷新。写入会缓冲在内存中——自上次写入以来的数据 Save() 会在崩溃时丢失。

IKeyValueStore 实现的适配器模式

builder.UsePersistence() 需要 IPersistenceProvider. 使用此适配器包装任何 IKeyValueStore:

DeleteAll(string prefix) 在此适配器中返回失败结果。SDK 会在 DeleteAll 会话重置操作期间调用。若您的部署需要完整的会话重置,请实现 DeleteAll 通过遍历存储的键并移除与前缀匹配的项。

注册提供器

故障排查

症状
可能原因
修复

重启后会话未恢复

GetString 返回 null 用于重新加载会话键

确保 Save() 在应用退出前同步调用。订阅 Application.quitting

NullReferenceException 内部 IPersistenceProvider 实现

在存储初始化之前调用异步方法

在提供器的构造函数中初始化后端存储,在 UsePersistence() 被调用。

崩溃时的数据丢失

SetString 写入会缓冲在内存中,并且 Save() 未被调用

调用 Save() 在每次写入后,或通过定时器刷新。

会话重置无法清除所有 SDK 数据

DeleteAll(prefix) 在适配器中返回失败结果

实现 DeleteAll 通过遍历存储的键集合并移除前缀匹配项。

下一步

凭据、身份与存储运行时模块系统实现自定义模块

最后更新于

这有帮助吗?