> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 publisher data

> 使用 SetPublisherData、GetPublisherData 和相关 API 在 PlayFab 工作室中的多个 title 之间共享配置和玩家键值数据。

本教程介绍如何创建和使用 Publisher (Studio) 数据。

Publisher 数据是跨越*多个 title* 的数据——例如当你有多个游戏需要共享公共信息时。

<Note>
  此类别还包括跨越多个游戏的玩家数据。PlayFab 将数据存储为键/值对 (KVP)。
</Note>

这些 API 中的大多数都是服务器 API，你的程序必须从专用服务器或通过 PlayFab 服务中的 CloudScript 函数调用它们。

* 使用服务器 API **[SetPublisherData](xref:titleid.playfabapi.com.server.title-widedatamanagement.setpublisherdata)** 更新，以及 **[GetPublisherData](xref:titleid.playfabapi.com.server.title-widedatamanagement.getpublisherdata)** 检索 Publisher 特定的自定义 KVP。
* 使用 **[UpdateUserPublisherData](xref:titleid.playfabapi.com.client.playerdatamanagement.updateuserpublisherdata)** 创建或更新，以及 **[GetUserPublisherData](xref:titleid.playfabapi.com.client.playerdatamanagement.getuserpublisherdata)** 检索玩家的 Publisher 特定的自定义 KVP。
* 使用服务器 API **[UpdateUserPublisherReadOnlyData](xref:titleid.playfabapi.com.server.playerdatamanagement.updateuserpublisherreadonlydata)** 更新，以及客户端 API **[GetUserPublisherReadOnlyData](xref:titleid.playfabapi.com.client.playerdatamanagement.getuserpublisherreadonlydata)** 检索用户的只读 Publisher 特定的自定义 KVP。
* 使用服务器 API **[UpdateUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.updateuserpublisherinternaldata)** 更新，以及 **[GetUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.getuserpublisherinternaldata)** 检索用户的内部 Publisher 特定的自定义 KVP。

你必须从专用服务器或通过 PlayFab 服务中的 CloudScript 函数调用服务器 API。这是设计使然，因为 PlayFab 服务器 API 要求你提供密钥。

<Tip>
  我们*不建议*在游戏客户端内使用服务器 API。如果你需要使用服务器 API，请对此类功能使用 CloudScript。
</Tip>

Publisher 数据值会被复制并分发到 PlayFab 集群服务器中可能*数百*台机器。作为此过程的一部分，此数据会被缓存，并且更改可能需要长达*十五分钟*才能在这些缓存中刷新。

<Note>
  Publisher 数据最适合*全局常量/静态数据*，*不*适合或不可靠作为*全局变量*。
</Note>

## Publisher 数据

Publisher 数据用于为一组 title 存储静态数据。每个条目*不绑定*到任何 PlayFab 实体，例如玩家（与 [user publisher data](#user-publisher-data) 相反）。

### 设置 Publisher 数据

以下代码段演示了如何使用服务器 API 设置 Publisher 数据。

<Note>
  此操作有对应的 admin API。
</Note>

```csharp theme={null}
public void ServerSetPublisherData() {
    PlayFabServerAPI.SetPublisherData(new SetPublisherDataRequest() {
            Key = "SomeKey",
            Value = "SomeValue"
        },
        result => Debug.Log("Complete setting publisher data"),
        error => {
            Debug.Log("Got error setting publisher data");
            Debug.Log(error.GenerateErrorReport());
        }
    );
}
```

### 获取 Publisher 数据

以下代码段演示了使用客户端 API 获取 Publisher 数据。

<Note>
  此操作有对应的服务器和 admin API。
</Note>

```csharp theme={null}
public void ClientGetPublisherData() {
    PlayFabClientAPI.GetPublisherData(new GetPublisherDataRequest(),
    result => {
        if (result.Data == null || !result.Data.ContainsKey("SomeKey")) Debug.Log("No SomeKey");
        else Debug.Log("SomeKey: " + result.Data["SomeKey"]);
    },
    error => {
        Debug.Log("Got error getting publisher data");
        Debug.Log(error.GenerateErrorReport());
    });
}
```

## 用户 Publisher 数据

用户 Publisher 数据可用于引入绑定到 PlayFab 用户（玩家）的 Publisher 数据。

与常规 Publisher 数据不同，客户端应用程序可以更改用户 Publisher 数据。

从客户端 API 角度来看，PlayFab 为用户 Publisher 数据公开了 3 种保护级别：

1. 常规用户 Publisher 数据向客户端应用程序公开读取和写入访问权限。

   * 通过 Client、Server 和 Admin API 设置。
   * 通过 Client、Server 和 Admin API 获取。
   * Client API 只能为当前登录的玩家设置 Publisher 数据。

2. 只读用户 Publisher 数据向客户端应用程序公开读取访问权限。

   * 通过 Server 和 Admin API 设置。
   * 通过 Client、Server 和 Admin API 获取。

3. 内部用户 Publisher 数据不向客户端应用程序公开访问权限，用于存储用户数据的秘密部分。

   * 通过 Server 和 Admin API 设置。
   * 通过 Server 和 Admin API 获取。

### 设置用户 Publisher 数据

以下代码段演示了如何使用 Client 和 Server API 设置全部 3 种 Publisher 数据。

```csharp theme={null}
// Use Client API to set User Publisher Data for current user
public void ClientSetUserPublisherData() {
    PlayFabClientAPI.UpdateUserPublisherData(new UpdateUserDataRequest() {
         Data  = new Dictionary<string, string>() {
             { "SomeKey", "SomeValue" }
         }
    },
    result => Debug.Log("Complete setting Regular User Publisher Data"),
    error =>
    {
        Debug.Log("Error setting Regular User Publisher Data");
        Debug.Log(error.GenerateErrorReport());
    });
}

// Use Server API to set Read-Only User Publisher Data for selected user
public void ServerSetUserPublisherReadOnlyData() {
    PlayFabServerAPI.UpdateUserPublisherReadOnlyData(new UpdateUserDataRequest() {
         PlayFabId = "< PlayFab Player Id >",
         Data  = new Dictionary<string, string>() {
             { "SomeKey", "SomeValue" }
         }
    },
    result => Debug.Log("Complete setting Read-Only User Publisher Data"),
    error =>
    {
        Debug.Log("Error setting Read-Only User Publisher Data");
        Debug.Log(error.GenerateErrorReport());
    });
}

// Use Server API to set Internal User Publisher Data for selected user
public void ServerSetUserPublisherInternalData() {
    PlayFabServerAPI.UpdateUserPublisherInternalData(new UpdateUserInternalDataRequest() {
         PlayFabId = "< PlayFab Player Id >",
         Data  = new Dictionary<string, string>() {
             { "SomeKey", "SomeValue" }
         }
    },
    result => Debug.Log("Complete setting Internal User Publisher Data"),
    error =>
    {
        Debug.Log("Error setting Internal User Publisher Data");
        Debug.Log(error.GenerateErrorReport());
    });
}
```

### 获取用户 Publisher 数据

以下代码段演示了如何使用 Client 和 Server API 获取全部 3 种 Publisher 数据。

```csharp theme={null}
// Use Client API to get Regular User Publisher Data for selected user
public void ClientGetUserPublisherData() {
    PlayFabClientAPI.GetUserPublisherData(new GetUserDataRequest() {
        PlayFabId = "<PlayFab Player Id>"
    }, result => {
        if (result.Data == null || !result.Data.ContainsKey("SomeKey")) Debug.Log("No SomeKey");
        else Debug.Log("SomeKey: " + result.Data["SomeKey"]);
    },
    error => {
        Debug.Log("Got error getting Regular Publisher Data:");
        Debug.Log(error.GenerateErrorReport());
    });
}

// Use Client API to get Read-Only User Publisher Data for selected user
public void ClientGetUserPublisherReadOnlyData() {
    PlayFabClientAPI.GetUserPublisherReadOnlyData(new GetUserDataRequest() {
        PlayFabId = "<PlayFab Player Id>"
    }, result => {
        if (result.Data == null || !result.Data.ContainsKey("SomeKey")) Debug.Log("No SomeKey");
        else Debug.Log("SomeKey: " + result.Data["SomeKey"]);
    },
    error => {
        Debug.Log("Got error getting Read-Only Publisher Data:");
        Debug.Log(error.GenerateErrorReport());
    });
}

// Use Server API to get Internal User Publisher Data for selected user
public void ServerGetUserPublisherInternalData() {
    PlayFabServerAPI.GetUserPublisherInternalData(new GetUserDataRequest() {
        PlayFabId = "<PlayFab Player Id>"
    }, result => {
        if (result.Data == null || !result.Data.ContainsKey("SomeKey")) Debug.Log("No SomeKey");
        else Debug.Log("SomeKey: " + result.Data["SomeKey"]);
    },
    error => {
        Debug.Log("Got error getting Internal Publisher Data:");
        Debug.Log(error.GenerateErrorReport());
    });
}
```

## 另请参阅

* [Title Data 快速入门](/services/playfab/live-service-management/game-configuration/titledata/quickstart)
* [CloudScript 快速入门](/services/playfab/live-service-management/service-gateway/automation/cloudscript/quickstart))


## Related topics

- [Title Data 快速入门](/zh-CN/services/playfab/live-service-management/game-configuration/titledata/quickstart.md)
- [PFTitleDataManagementSetPublisherDataRequest](/zh-CN/services/playfab/api-references/c/pftitledatamanagementtypes/structs/pftitledatamanagementsetpublisherdatarequest.md)
- [PFPlayerDataManagementClientUpdateUserPublisherDataAsync](/zh-CN/services/playfab/api-references/c/pfplayerdatamanagement/functions/pfplayerdatamanagementclientupdateuserpublisherdataasync.md)
- [PFTitleDataManagementServerGetPublisherDataAsync](/zh-CN/services/playfab/api-references/c/pftitledatamanagement/functions/pftitledatamanagementservergetpublisherdataasync.md)
- [PFTitleDataManagementServerSetPublisherDataAsync](/zh-CN/services/playfab/api-references/c/pftitledatamanagement/functions/pftitledatamanagementserversetpublisherdataasync.md)
