获取应用和加载项的产品信息

面向 Windows10 版本 1607 或更高版本的应用可以使用 Windows.Services.Store 命名空间中 StoreContext 类的方法,来访问当前应用或它的一个加载项的与应用商店相关的信息。 本文中的以下示例展示了如何针对不同的情况执行此操作。

有关完整的应用程序示例,请参阅应用商店示例

备注

本文适用于面向 Windows 10 版本 1607 或更高版本的应用。 如果你的应用面向 Windows 10 的较早版本,则必须使用 Windows.ApplicationModel.Store 命名空间来替代 Windows.Services.Store 命名空间。 有关详细信息,请参阅使用 Windows.ApplicationModel.Store 命名空间进行应用内购买和试用

先决条件

这些示例有以下先决条件:

  • 适用于面向 Windows10 版本 1607 或更高版本的通用 Windows 平台 (UWP) 应用的 Visual Studio 项目。
  • 你已在 Windows 开发人员中心仪表板中创建了一个应用提交,并且该应用已发布到应用商店中。 在测试应用期间,你可以选择将应用配置为在应用商店中隐藏。 有关详细信息,请参阅测试指南
  • 如果你想要获取应用的某个加载项的产品信息,还必须在开发人员中心仪表板中创建加载项

这些示例中的代码假设:

  • 代码在含有 ProgressRing(名为 workingProgressRing)和 TextBlock(名为 textBlock)的 Page 上下文中运行。 这些对象分别用于指示是否正在进行异步操作和显示输出消息。
  • 代码文件有一个适用于 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}";
}

使用已知应用商店 ID 获取产品信息

若要获取你已知道其应用商店 ID 的应用或加载项的应用商店产品信息,请使用 GetStoreProductsAsync 方法。 这是一种异步方法,可返回代表每一个应用或加载项的 StoreProduct 对象的集合。 除了应用商店 ID 之外,还必须向此方法传递一列字符串,用于标识加载项的类型。 有关受支持的字符串值列表,请参阅 ProductKind 属性。

以下示例使用指定的应用商店 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 方法分页返回加载项结果。

以下示例使用指定的应用商店 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...
    }
}