色々と苦労ばかりしてますが、何だかんだで 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 /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.
In-app purchases and trials
情報自体は GetAppLicenseAsync メソッドで取得できますが、AddOnLicenses のキーは StoreSku から取得できる StoreId なので、単純にインデクサーで引くとエラーになります。
なので、LINQ を使って StartsWith で比較するか、StoreSku を先に調べて引っ張ってくるかの方法が必要になりそうです。挙動が不明だったので、私は後者を選びました。
var list = await context.GetAssociatedStoreProductsAsync(new[] { "Durable" });
var skuStoreId = list.Products[StoreId].Skus[0].StoreId;
var license = await context.GetAppLicenseAsync();
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 のみ利用可能です。
- 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.
Microsoft Store Services SDK extension
英語版のドキュメントは既に 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 が受け持ってくれるのは便利ですね。