> For the complete documentation index, see [llms.txt](https://docs.convai.com/api-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.convai.com/api-docs/zh/cha-jian-yu-ji-cheng/unity-plugin/utilities/managing-sessionid-locally.md).

# 本地管理 sessionID

在一个典型的与 Convai API 集成的应用中，在不同会话之间保持一致的会话 ID 对于提供无缝的用户体验至关重要。本文档概述了使用 Unity 的方式存储和检索会话 ID 的最佳实践 `PlayerPrefs`，包括详细步骤和示例脚本。

## **会话 ID 的重要性**

会话 ID 可唯一标识客户端与 Convai 服务器之间的一个会话。将会话 ID 本地存储可确保在不同会话中使用相同的会话 ID，这有助于在交互中保持上下文和连续性。

## **存储会话 ID**

在初始化会话时，如果本地没有可用的会话 ID，则应从服务器获取并随后本地存储以备将来使用。以下是实现方法：

1. **获取并存储会话 ID**：在初始化会话时，检查本地是否已存储会话 ID。如果没有，则从服务器获取新的会话 ID，并使用 `PlayerPrefs`.

```csharp
public static async Task<string> InitializeSessionIDAsync(string characterName, ConvaiService.ConvaiServiceClient client, string characterID)
{
    // 检索已存储的会话 ID（如果存在）
    string sessionID = PlayerPrefs.GetString(characterID, string.Empty);

    // 如果未存储会话 ID，则初始化一个新的
    if (string.IsNullOrEmpty(sessionID))
    {
        sessionID = await ConvaiGRPCAPI.InitializeSessionIDAsync(characterName, client, characterID, sessionID);

        // 将新的会话 ID 本地存储
        if (!string.IsNullOrEmpty(sessionID))
        {
            PlayerPrefs.SetString(characterID, sessionID);
            PlayerPrefs.Save();
        }
    }

    return sessionID;
}
```

## **检索会话 ID**

在初始化应用程序时，检索已存储的会话 ID，以确保用户交互的连续性。

```csharp
private async void Start()
{
    // 在启动时初始化会话 ID
    string characterID = "YourCharacterID"; // 替换为你实际的角色 ID
    string sessionID = await InitializeSessionIDAsync("CharacterName", grpcClient, characterID);

    if (!string.IsNullOrEmpty(sessionID))
    {
        Debug.Log("Session ID initialized and stored: " + sessionID);
    }
    否则
    {
        Debug.LogError("Failed to initialize session ID.");
    }
}
```

## 会话管理示例类

以下示例类演示了如何使用 `PlayerPrefs` 在 Unity 项目中管理会话 ID：

```csharp
using System;
using System.Threading.Tasks;
using Convai.Scripts.Utils;
using Google.Protobuf;
using Grpc.Core;
using Service;
using UnityEngine;
using static Service.GetResponseRequest.Types;

public class SessionManager : MonoBehaviour
{
    public ConvaiService.ConvaiServiceClient grpcClient;

    private void Start()
    {
        // 在启动时初始化会话 ID
        InitializeSession("CharacterName", grpcClient, "YourCharacterID");
    }

    private async void InitializeSession(string characterName, ConvaiService.ConvaiServiceClient client, string characterID)
    {
        string sessionID = await InitializeSessionIDAsync(characterName, client, characterID);

        if (!string.IsNullOrEmpty(sessionID))
        {
            Debug.Log("Session ID initialized and stored: " + sessionID);
        }
        否则
        {
            Debug.LogError("Failed to initialize session ID.");
        }
    }

    public static async Task<string> InitializeSessionIDAsync(string characterName, ConvaiService.ConvaiServiceClient client, string characterID)
    {
        string sessionID = PlayerPrefs.GetString(characterID, string.Empty);

        if (string.IsNullOrEmpty(sessionID))
        {
            sessionID = await ConvaiGRPCAPI.InitializeSessionIDAsync(characterName, client, characterID, sessionID);

            if (!string.IsNullOrEmpty(sessionID))
            {
                PlayerPrefs.SetString(characterID, sessionID);
                PlayerPrefs.Save();
            }
        }

        return sessionID;
    }
}
```

## 会话管理的详细步骤

1. **初始化会话**：调用 `InitializeSessionIDAsync` 以检查是否已存储会话 ID。如果没有，则获取并存储它。
2. **存储会话 ID**：使用 `PlayerPrefs.SetString(characterID, sessionID)` 将会话 ID 本地存储。
3. **检索会话 ID**：使用 `PlayerPrefs.GetString(characterID, string.Empty)` 以检索已存储的会话 ID。
4. **使用会话 ID**：将会话 ID 传递给你的 Convai API 调用，以保持会话连续性。

## 最佳实践

* **错误处理**：在获取和存储会话 ID 时，确保进行适当的错误处理。
* **安全性**：考虑对存储在 `PlayerPrefs`.
* **性能**：使用异步方法，以避免在获取会话 ID 时阻塞主线程。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.convai.com/api-docs/zh/cha-jian-yu-ji-cheng/unity-plugin/utilities/managing-sessionid-locally.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
