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 類以及相關信息,可以參考: