しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

UWP でアプリを作ってから 1 週間でやったことをまとめた

色々と苦労ばかりしてますが、何だかんだで UWP で作ったアプリの更新を頻繁に行っています。

情報が非常に少ないという点が苦労の原因なので、文句ばかり言わず調べた部分に関してはまとめます。実際にアプリに組み込んで試したことだけ書いてますが、間違っている可能性は高いです。

HockeyApp を有効化

Visual Studio から HockeyApp のクラッシュ分析を有効化すると、簡単にアカウント作ったりアプリの登録が出来ますが、AppId の設定は自分で行う必要があるみたいでした。

using Microsoft.HockeyApp;

public sealed partial class App
{
    public App()
    {
        HockeyClient.Current.Configure("APPID");

        InitializeComponent();

        Suspending += OnSuspending;
    }
}

公式のサンプルが InitializeComponent の前に呼び出していたので、同じようにしました。

f:id:shiba-yan:20160817214734p:plain

正しく設定が行えていると、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 を先に調べて引っ張ってくるかの方法が必要になりそうです。挙動が不明だったので、私は後者を選びました。

// 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 のみ利用可能です。

  • 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 が受け持ってくれるのは便利ですね。