取得應用程式和附加元件的產品資訊
本文示範如何在 Windows.Services.Store 命名空間中使用 StoreContext 類別的方法,來存取目前應用程式或其中一個附加元件之市集相關資訊。
如需完整的範例應用程式,請參閱市集範例。
注意
Windows.Services.Store 命名空間是在 Windows 10 版本 1607 中引進的,而且在 Visual Studio 中只能用於以 Windows 10 年度版本 (10.0;組建 14393) 或更新版本為目標的專案。 如果您的應用程式以舊版 Windows 10 為目標,您必須使用 Windows.ApplicationModel.Store 命名空間,而不是 Windows.Services.Store 命名空間。 如需詳細資訊,請參閱這篇文章。
必要條件
這些範例具有下列必要條件:
- 以 Windows 10 年度版本 (10.0;組建 14393) 或更新版本為目標之通用 Windows 平台 (UWP) 應用程式的 Visual Studio 專案。
- 您已在合作夥伴中心建立應用程式提交,且此應用程式會在市集中發佈。 您可以選擇將應用程式設定為在您進行測試時無法在市集中探索。 如需詳細資訊,請參閱我們測試指導方針。
- 如果您想要取得應用程式附加元件的產品資訊,您還必須在合作夥伴中心建立附加元件。
這些範例中的程式碼假設:
- 程序碼會在 Page 的內容中執行,其中包含名為
workingProgressRing
的 ProgressRing 和名為textBlock
的 TextBlock。 這些物件是用來指出非同步作業正在發生,以及分別顯示輸出訊息。 - 程式碼檔案具有 Windows.Services.Store 命名空間的 using 陳述式。
- 應用程式是單一使用者應用程式僅會在啟動應用程式的使用者內容中執行。 如需詳細資訊,請參閱應用程式內購買和試用版。
注意
如果您有使用傳統型橋接器的傳統型應用程式,可能需要新增未顯示在這些範例中的其他程式碼來設定 StoreContext 物件。 如需詳細資訊,請參閱在使用傳統型橋接器的傳統型應用程式中使用 StoreContext 類別。
取得目前應用程式的資訊
若要取得目前應用程式的市集產品資訊,請使用 GetStoreProductForCurrentAppAsync 方法。 這是一種非同步方法,會傳回 StoreProduct 物件,可用來取得價格等資訊。
private StoreContext context = null;
public async void GetAppInfo()
{
if (context == null)
{
context = StoreContext.GetDefault();
// If your app is a desktop app that uses the Desktop Bridge, you
// may need additional code to configure the StoreContext object.
// For more info, see https://aka.ms/storecontext-for-desktop.
}
// Get app store product details. Because this might take several moments,
// display a ProgressRing during the operation.
workingProgressRing.IsActive = true;
StoreProductResult queryResult = await context.GetStoreProductForCurrentAppAsync();
workingProgressRing.IsActive = false;
if (queryResult.Product == null)
{
// The Store catalog returned an unexpected result.
textBlock.Text = "Something went wrong, and the product was not returned.";
// Show additional error info if it is available.
if (queryResult.ExtendedError != null)
{
textBlock.Text += $"\nExtendedError: {queryResult.ExtendedError.Message}";
}
return;
}
// Display the price of the app.
textBlock.Text = $"The price of this app is: {queryResult.Product.Price.FormattedBasePrice}";
}
使用與目前應用程式相關聯的已知 Store ID 取得附加元件資訊
對於與目前應用程式相關聯且您已知道 Store ID 的附加元件,若要取得市集產品資訊,請使用 GetStoreProductsAsync 方法。 這是非同步方法,會傳回代表每個附加元件之 StoreProduct 物件的集合。 除了 Store ID 之外,您必須將字串清單傳遞至這個方法,以識別附加元件的類型。 如需支援的字串值清單,請參閱 ProductKind 屬性。
注意
不論附加元件目前是否可供購買,GetStoreProductsAsync 方法都會傳回與應用程式相關聯的指定附加元件產品資訊。 若要針對目前可購買的應用程式擷取其所有附加元件的資訊,請改用 GetAssociatedStoreProductsAsync 方法,如下一節中所述。
此範例會使用與目前應用程式相關聯之指定 Store ID 擷取耐久性附加元件的資訊。
private StoreContext context = null;
public async void GetProductInfo()
{
if (context == null)
{
context = StoreContext.GetDefault();
// If your app is a desktop app that uses the Desktop Bridge, you
// may need additional code to configure the StoreContext object.
// For more info, see https://aka.ms/storecontext-for-desktop.
}
// Specify the kinds of add-ons to retrieve.
string[] productKinds = { "Durable" };
List<String> filterList = new List<string>(productKinds);
// Specify the Store IDs of the products to retrieve.
string[] storeIds = new string[] { "9NBLGGH4TNMP", "9NBLGGH4TNMN" };
workingProgressRing.IsActive = true;
StoreProductQueryResult queryResult =
await context.GetStoreProductsAsync(filterList, storeIds);
workingProgressRing.IsActive = false;
if (queryResult.ExtendedError != null)
{
// The user may be offline or there might be some other server failure.
textBlock.Text = $"ExtendedError: {queryResult.ExtendedError.Message}";
return;
}
foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
{
// Access the Store info for the product.
StoreProduct product = item.Value;
// Use members of the product object to access info for the product...
}
}
取得可從目前應用程式購買的附加元件資訊
若要針對目前可從目前應用程式購買的附加元件取得市集產品資訊,請使用 GetAssociatedStoreProductsAsync 方法。 這是非同步方法,會傳回代表每個可用附加元件之 StoreProduct 物件的集合。 您必須將字串清單傳遞至此方法,以識別您想要擷取的附加元件類型。 如需支援的字串值清單,請參閱 ProductKind 屬性。
注意
如果應用程式有許多附加元件可供購買,您也可以使用 GetAssociatedStoreProductsWithPagingAsync 方法來使用分頁傳回附加元件結果。
下列範例會擷取所有耐久性附加元件、市集管理的消耗性附加元件,以及可從目前應用程式購買之開發人員管理的消耗性附加元件的資訊。
private StoreContext context = null;
public async void GetAddOnInfo()
{
if (context == null)
{
context = StoreContext.GetDefault();
// If your app is a desktop app that uses the Desktop Bridge, you
// may need additional code to configure the StoreContext object.
// For more info, see https://aka.ms/storecontext-for-desktop.
}
// Specify the kinds of add-ons to retrieve.
string[] productKinds = { "Durable", "Consumable", "UnmanagedConsumable" };
List<String> filterList = new List<string>(productKinds);
workingProgressRing.IsActive = true;
StoreProductQueryResult queryResult = await context.GetAssociatedStoreProductsAsync(filterList);
workingProgressRing.IsActive = false;
if (queryResult.ExtendedError != null)
{
// The user may be offline or there might be some other server failure.
textBlock.Text = $"ExtendedError: {queryResult.ExtendedError.Message}";
return;
}
foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
{
// Access the Store product info for the add-on.
StoreProduct product = item.Value;
// Use members of the product object to access listing info for the add-on...
}
}
針對使用者已購買的目前應用程式取得附加元件資訊
若要針對目前使用者已購買的附加元件取得市集產品資訊,請使用 GetUserCollectionAsync 方法。 這是非同步方法,會傳回代表每個附加元件之 StoreProduct 物件的集合。 您必須將字串清單傳遞至此方法,以識別您想要擷取的附加元件類型。 如需支援的字串值清單,請參閱 ProductKind 屬性。
注意
如果應用程式有許多附加元件,您也可以使用 GetUserCollectionWithPagingAsync 方法來使用分頁傳回附加元件結果。
下列範例使用指定 Store ID 擷取耐久性附加元件的資訊。
private StoreContext context = null;
public async void GetUserCollection()
{
if (context == null)
{
context = StoreContext.GetDefault();
// If your app is a desktop app that uses the Desktop Bridge, you
// may need additional code to configure the StoreContext object.
// For more info, see https://aka.ms/storecontext-for-desktop.
}
// Specify the kinds of add-ons to retrieve.
string[] productKinds = { "Durable" };
List<String> filterList = new List<string>(productKinds);
workingProgressRing.IsActive = true;
StoreProductQueryResult queryResult = await context.GetUserCollectionAsync(filterList);
workingProgressRing.IsActive = false;
if (queryResult.ExtendedError != null)
{
// The user may be offline or there might be some other server failure.
textBlock.Text = $"ExtendedError: {queryResult.ExtendedError.Message}";
return;
}
foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
{
StoreProduct product = item.Value;
// Use members of the product object to access info for the product...
}
}