色々と苦労ばかりしてますが、何だかんだで UWP で作ったアプリの更新を頻繁に行っています。
情報が非常に少ないという点が苦労の原因なので、文句ばかり言わず調べた部分に関してはまとめます。実際にアプリに組み込んで試したことだけ書いてますが、間違っている可能性は高いです。
HockeyApp を有効化
Visual Studio から HockeyApp のクラッシュ分析を有効化すると、簡単にアカウント作ったりアプリの登録が出来ますが、AppId の設定は自分で行う必要があるみたいでした。
using Microsoft.HockeyApp; public sealed partial class App { public App() { HockeyClient.Current.Configure("APPID"); InitializeComponent(); Suspending += OnSuspending; } }
公式のサンプルが InitializeComponent の前に呼び出していたので、同じようにしました。
正しく設定が行えていると、HockeyApp のダッシュボードに情報が表示され始めます。最低でも Version が表示されていない場合は設定に失敗しているので、AppId を確認する必要があります。
課金処理を StoreContext API に変更
昔から存在している CurrentApp を使った課金処理は、Windows 10 Anniversary Update から新しく追加された StoreContext に置き換えられるようです。
https://msdn.microsoft.com/en-us/windows/uwp/monetize/in-app-purchases-and-trials
API が大きく変わっているのと、サンプルコードがいまいちでわかりにくかったので、実際に自分が書いたコードを参考までに載せておきます。正しいのかはわからないので自己責任で。
アドオンの購入は RequestPurchaseAsync メソッドに StoreId を渡すだけなので、これまでとあまり違いはないです。ProductId ではなく StoreId なので注意が必要です。
var context = StoreContext.GetDefault(); var result = await context.RequestPurchaseAsync(StoreId); switch (result.Status) { case StorePurchaseStatus.AlreadyPurchased: // 既に購入済み break; case StorePurchaseStatus.Succeeded: // 購入完了 break; default: // エラー扱いにする return; }
購入後は Status の値によってダイアログを出したりすることになると思います。
そして購入済みライセンスのチェックですが、新しい API では SKU という概念が追加されたみたいなので、これまでより少しめんどくさくなりました。
For a SKU, the Store ID has the format
In-app purchases and trials/xxxx, where xxxx is a 4-character alpha-numeric string that identifies a SKU for the product. For example, 9NBLGGH4R315/000N. This ID is returned by the StoreId property of a StoreSku object, and it is sometimes called the SKU Store ID.
情報自体は GetAppLicenseAsync メソッドで取得できますが、AddOnLicenses のキーは StoreSku から取得できる StoreId なので、単純にインデクサーで引くとエラーになります。
なので、LINQ を使って StartsWith で比較するか、StoreSku を先に調べて引っ張ってくるかの方法が必要になりそうです。挙動が不明だったので、私は後者を選びました。
// Durable なアドオンを取得する var list = await context.GetAssociatedStoreProductsAsync(new[] { "Durable" }); // Skus は必ず 1 つ存在する var skuStoreId = list.Products[StoreId].Skus[0].StoreId; // ライセンス情報を取得 var license = await context.GetAppLicenseAsync(); // AddOnLicenses は KeyNotFoundException を投げる if (license.AddOnLicenses.ContainsKey(skuStoreId) && license.AddOnLicenses[skuStoreId].IsActive) { // アドオンを購入済み }
ひとまず、これで StoreContext を使った IAP が動作するようになりました。
AdMediator が削除されたので変更
これまで Microsoft Store Engagement and Monetization SDK としてリリースされていた拡張が、先日新しく Microsoft Store Services SDK に変わりましたが、このタイミングで AdMediator が削除されました。
今後はサーバーサイドに切り替わっていくみたいですが、SDK がリリースされてもサーバー側がリリースされていないので、現状は Microsoft Advertising のみ利用可能です。
Microsoft Store Services SDK extension
- AdMediator is no longer being maintained as we shift to server side mediation.
- For Windows 10 apps, an MSDN topic is coming out this week with prescriptive steps to refactor.
英語版のドキュメントは既に Store Services SDK 向けに更新されています。
https://msdn.microsoft.com/windows/uwp/monetize/microsoft-store-services-sdk
おそらく近日中にサーバー側がリリースされるんでしょう、足並み揃えろという感は拭えませんが。
Feedback Hub の起動コードを変更
Insider 向け機能として提供されている Feedback Hub を使ったフィードバック機能ですが、Store Services SDK の更新に従って微妙に API が更新されています。
まず StoreServicesFeedbackLauncher.IsSupported メソッドを使って、利用可能かチェックします。
if (StoreServicesFeedbackLauncher.IsSupported())
{
feedbackButton.Visibility = Visibility.Visible;
}
何故か IsSupported はメソッドに変更されています。このあたりイマイチですね。
実際に Feedback Hub を開くためには StoreServicesFeedbackLauncher.GetDefault メソッドでインスタンスを取得した後、LaunchAsync メソッドを呼び出します。
private async void FeedbackButton_Click(object sender, RoutedEventArgs e) { await StoreServicesFeedbackLauncher.GetDefault().LaunchAsync(); }
この修正はシンプルなのですぐ対応できます。
実際にフィードバックが送られるとどうなるのかはよくわかっていないですが、めんどくさい部分を Windows Store が受け持ってくれるのは便利ですね。