> ## 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.

# 使用發行者資料

> 使用 SetPublisherData、GetPublisherData 及相關 API，在 PlayFab 工作室中的多個遊戲之間共用設定和玩家索引鍵/值資料。

本教學課程說明如何透過發行者資料 API 建立和使用限定於命名空間範圍的資料。

發行者資料是跨越 PlayFab 命名空間中多個遊戲的靜態資料，例如當多款遊戲需要共用通用資訊時。**Publisher** 是命名空間範圍較舊的 API 用語，而發行者識別碼 (Publisher ID) 用於識別命名空間。命名空間與工作室不同，工作室是遊戲、使用者、權限和計費的管理分組。如需詳細資訊，請參閱 [PlayFab 概念](/zh-TW/services/playfab/get-started/concepts#studios-namespaces-and-titles)。

<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)** 擷取發行者專屬的自訂 KVP。
* 使用 **[UpdateUserPublisherData](xref:titleid.playfabapi.com.client.playerdatamanagement.updateuserpublisherdata)** 建立或更新、使用 **[GetUserPublisherData](xref:titleid.playfabapi.com.client.playerdatamanagement.getuserpublisherdata)** 擷取玩家的發行者專屬自訂 KVP。
* 使用伺服器 API **[UpdateUserPublisherReadOnlyData](xref:titleid.playfabapi.com.server.playerdatamanagement.updateuserpublisherreadonlydata)** 更新、使用用戶端 API **[GetUserPublisherReadOnlyData](xref:titleid.playfabapi.com.client.playerdatamanagement.getuserpublisherreadonlydata)** 擷取使用者的唯讀發行者專屬自訂 KVP。
* 使用伺服器 API **[UpdateUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.updateuserpublisherinternaldata)** 更新、使用 **[GetUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.getuserpublisherinternaldata)** 擷取使用者的內部發行者專屬自訂 KVP。

您必須從專用伺服器或透過 PlayFab 服務的 CloudScript 函式呼叫伺服器 API。這是刻意設計的，因為 PlayFab 伺服器 API 要求您提供秘密金鑰。

<Tip>
  我們*不建議*在遊戲用戶端內使用伺服器 API。如果您需要使用伺服器 API，請使用 CloudScript 實現此類功能。
</Tip>

發行者資料值會複製並散發到 PlayFab 叢集伺服器中可能多達*數百*部的機器。在此過程中，此資料會被快取，而變更最多可能需要*十五分鐘*才能在這些快取中重新整理。

<Note>
  發行者資料最適合用於*全域常數/靜態資料*，*不*適合也不可靠地用作*全域變數*。
</Note>

## 發行者資料

發行者資料用於儲存命名空間中遊戲的靜態資料。每個項目都*不會繫結*至玩家實體 (與[使用者發行者資料](#user-publisher-data)相反)。

### 設定發行者資料

下列程式碼片段示範如何使用伺服器 API 設定發行者資料。

<Note>
  此作業有對應的管理 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());
        }
    );
}
```

### 取得發行者資料

下列程式碼片段示範如何使用用戶端 API 取得發行者資料。

<Note>
  此作業有對應的伺服器和管理 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());
    });
}
```

<a id="user-publisher-data" />

## 使用者發行者資料

使用者發行者資料可用來引進繫結至 PlayFab 使用者 (玩家) 的發行者資料。

與一般發行者資料不同，用戶端應用程式可以變更使用者發行者資料。

從用戶端 API 的角度來看，PlayFab 為使用者發行者資料提供 3 種保護等級：

1. 一般使用者發行者資料為用戶端應用程式提供讀取和寫入存取權。

   * 透過用戶端、伺服器和管理 API 設定。
   * 透過用戶端、伺服器和管理 API 取得。
   * 用戶端 API 只能為目前已登入的玩家設定發行者資料。

2. 唯讀使用者發行者資料為用戶端應用程式提供讀取存取權。

   * 透過伺服器和管理 API 設定。
   * 透過用戶端、伺服器和管理 API 取得。

3. 內部使用者發行者資料不為用戶端應用程式提供任何存取權，用於儲存使用者資料的秘密部分。

   * 透過伺服器和管理 API 設定。
   * 透過伺服器和管理 API 取得。

### 設定使用者發行者資料

下列程式碼片段示範如何使用用戶端和伺服器 API 設定全部 3 種發行者資料。

```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());
    });
}
```

### 取得使用者發行者資料

下列程式碼片段示範如何使用用戶端和伺服器 API 取得全部 3 種發行者資料。

```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());
    });
}
```

## 另請參閱

* [遊戲資料快速入門](/zh-TW/services/playfab/live-service-management/game-configuration/titledata/quickstart)
* [CloudScript 快速入門](/zh-TW/services/playfab/live-service-management/service-gateway/automation/cloudscript/quickstart)


## Related topics

- [遊戲資料](/zh-TW/services/playfab/live-service-management/game-configuration/titledata/index.md)
- [遊戲資料快速入門](/zh-TW/services/playfab/live-service-management/game-configuration/titledata/quickstart.md)
- [玩家資料快速入門](/zh-TW/services/playfab/player-progression/player-data/quickstart.md)
- [取得使用者發行者資料](/zh-TW/services/playfab/api-references/rest/admin/player-data-management/get-user-publisher-data.md)
- [更新使用者發行者資料](/zh-TW/services/playfab/api-references/rest/admin/player-data-management/update-user-publisher-data.md)
