UWP: 體驗應用內購新接口——StoreContext類


Windows 1607 版本(內部版本 14393)之后,微軟在 SDK 添加了一些與應用商店相關的新接口,像應用試用與購買、應用內購等。這些接口相對於原來的接口要方便很多。就拿應用內購來說,以前的方式是:開發時,為了方便測試,在項目中添加一個 xml 文件,此文件描述了應用內的產品信息,然后使用 CurrentAppSimulator 來完成相關的操作;當應用要發布到商店時,再將所有的 CurrentAppSimulator 替換成 CurrentApp;而使用新接口,則可以直接在開發環境中,就可以訪問我們在開發人員中心(dev.windows.com/dashboard)中添加的產品,這樣就和實際的購買操作完全一樣,所以新接口更方便,更直觀。

新接口的信息如下:

命名空間:Windows.Services.Store
類:StoreContext

以下通過一個 Demo 來體驗一下:

1. 首先,在 Windows 開發人員中心,創建一個新的應用作為本次測試的應用,並在它里面創建若干個加載項,並設置好對應的標題、價格等;另外,本例中創建的加載項類型為 Durable 類型,即耐用型。

2. 接下來,新建一個 UWP Project,注意 TargetVersion 和 MinVersion,都應該選 Windows Aniversary Edtion (10.0, Build 14393)。新建完成后,右擊項目,選擇 Store (商店) -> Associate app with the Store(將 App 與商店關聯),在打開的窗口中,將這個項目與剛才在開發人員中心中創建的應用相關聯。

3. 將以下 XAML 內容放到 MainPage.xaml 中:

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ListView x:Name="listProducts" IsItemClickEnabled="True" SelectionMode="Single" ItemClick="listProducts_ItemClick">
            <ListView.ItemTemplate>
                <DataTemplate >
                    <TextBlock Text="{Binding Title}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>

4. 在 MainPage.xaml.cs 中,添加對命名空間 Windows.Services.Store 的引用,並將以下代碼放進去:

        private readonly StoreContext storeContext = StoreContext.GetDefault();

        public MainPage()
        {
            this.InitializeComponent();
            Loaded += MainPage_Loaded;
        }

        private async void MainPage_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            var result = await storeContext.GetAssociatedStoreProductsAsync(new string[] { "Durable" });
            if (result.ExtendedError != null)
            {
                // 出錯了
            }
            else
            {
                // 列出所有耐用的(Durable)內購項,並顯示
                StringBuilder sb = new StringBuilder();
                var products = result.Products.Values;
                foreach (var item in products)
                {
                    sb.AppendLine($"{item.Title} - {item.StoreId} - {item.InAppOfferToken} - {item.ProductKind} - {item.Price.FormattedPrice}");
                }
                await new MessageDialog(sb.ToString(), string.Empty).ShowAsync();

                this.listProducts.ItemsSource = products;
            }
        }

        private async void listProducts_ItemClick(object sender, ItemClickEventArgs e)
        {
            StoreContext context = StoreContext.GetDefault();
            var product = e.ClickedItem as StoreProduct;
            var result = await context.RequestPurchaseAsync(product.StoreId);
            if (result.Status == StorePurchaseStatus.Succeeded)
            {
                // 成功購買
            }
            else if (result.Status == StorePurchaseStatus.AlreadyPurchased)
            {
                // 已經購買過了
            }
            else if (result.Status == StorePurchaseStatus.NotPurchased)
            {
                // 用戶沒購買,即用戶中途取消了操作
            }
            else if (result.Status == StorePurchaseStatus.ServerError || result.Status == StorePurchaseStatus.NetworkError)
            {
                // 發生錯誤
            }
        }

編譯運行,當從商店獲取內購產品完成后,應用將彈出一個對話框顯示這些內購產品項的信息。在頁面的列表中,點擊某一項,即可對該產品進行購買,這個過程和真正的購買操作是完成一樣的,並且,它就是真正的購買過程。所以,使用新 API 就是這樣簡單。

由於上述代碼中已經有詳細的注釋,所以對代碼不再解釋,如果想要過多了解關於 StoreContext 類以及相關信息,可以參考:

StoreContext Class

ProductKind

應用內購買和試用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM