タイル画像を作成する
「UWPアプリ化」できましたが、スタートメニューに登録されるタイルは味気のないものです。もしも「Store」に出すなら、タイル画像を差し替えておかないと不合格になってしまいます。
このタイル画像は何枚も用意しなければならないので、以前は大変でした。Visual Studio 2017には1枚の画像から自動生成する機能が搭載され、ずいぶん楽になりました。アプリの商品価値を上げるためには個別に画像を用意した方がよいのですが、簡易的にはこれで十分です。
タイル画像を自動生成するには、元になる正方形の画像を1枚だけ用意します。専用の描画ソフトを使わなくても、PowerPointで作図し、それを表示したものをキャプチャして.pngフォーマットで保存するだけで、そこそこのものができるでしょう(サンプルコードのタイル画像も、そのようにして作りました)。サイズは縦横400ピクセルくらいにしてください。
そうしたらパッケージマニフェストの[ビジュアル資産]タブで作業します(次の画像)。[資産ジェネレーター]の[ソース]欄に作成した画像を指定してから[生成]ボタンをクリックするだけで、適当なサイズにリサイズして必要な画像を生成してくれます。
タイル画像を作るときのガイドラインは「Guidelines for tile and icon assets」を参照してください(本稿執筆時点では英語のみ)。
配布用のパッケージを作る
ここで、作業の順序とは前後しますが、配布用パッケージの作り方を先に説明しておきます。
「Store」を通さずに配布することを「サイドローディング」と呼びます。サイドローディング用のパッケージを作るには、購入したデジタル証明書をWAPプロジェクトに設定しておく必要があります(「Store」で配布する場合には必要ありません)。パッケージマニフェストの[パッケージ化]タブで、[証明書の選択]ボタンをクリックし、[証明書の構成]ドロップダウンで[証明書ストアから選択]を選んで作業します(次の画像)。
また、サイドローディングで配布するには、インストールするWindows 10の側でもサイドローディングを許可する設定が必要です。詳しくは、Sideload LOB apps in Windows 10をご覧ください。
パッケージを作成するには、ソリューションエクスプローラーでWAPプロジェクトを右クリックし、そのコンテキストメニューから[ストア]-[アプリ パッケージの作成]を選びます。[アプリ パッケージの作成]ダイアログが出てくるので、「Store」に提出する場合は[はい]を、サイドローディングで配布する場合は[いいえ]を選んで、次へ進みます(次の画像)。あとは指示に従ってパッケージを作成します。詳しくは「Visual Studio で UWP アプリをパッケージ化する」をご覧ください。
なお、パッケージが作成されると同時に、そのサブフォルダにPowerShellのスクリプトファイルが作成されています。このスクリプトを使うと、パッケージをテスト用にインストールできます。
プロトコルアクティベーションを宣言する
これは、「タイムライン」に対応させる話です。
「タイムライン」からアプリを起動してもらうために、プロトコルアクティベーションの宣言をします。パッケージマニフェストの[宣言]タブで、[プロトコル]を追加し、[名前]欄にアクティベーションURIのスキームを入力します。詳しくは、前回の3ページ目、「マニフェストでプロトコルを宣言する」の項目を参照してください。
ここで一度確認しておきましょう。WAPプロジェクトをビルドして実行し、「タイムライン」に登録し(サンプルコードでは、異なるWebページを表示するごとに登録します)、アプリを終了します。「タイムライン」で登録した「ユーザーアクティビティ」(カード)をクリックすると、アプリが起動するはずです。
デスクトップブリッジで動作していることを判定する
以上で「UWPアプリ化」できたわけですが、元のWPFアプリもあいかわらずそのまま動作します。生粋のWPFアプリと、それを「UWPアプリ化」したアプリの2種類が存在することになったわけです。今後も両方とも維持していくなら、実行時に「UWPアプリ化」された状態かどうかを判定する必要が出てくるでしょう。例えば、生粋のWPFアプリの状態では「タイムライン」は利用しない、といったようにです。
幸いにもその判定をしてくれるパッケージがNuGetで公開されています。
判定を使いたいのはWPFアプリのコードですから、WPFアプリのプロジェクトの方に「Helpers for the Windows 10 Desktop Bridge」を導入します。NuGetパッケージの管理画面で「DesktopBridge.Helpers」を検索してインストールします。
生粋のWPFアプリの状態では「タイムライン」を利用しないということであれば、DesktopBridge.Helpersを使って、前述のIsTimelineAvailable静的プロパティを次のコードのように修正します(Appクラス内)。
// デスクトップブリッジで動作しているか? // ※ NuGet パッケージ DesktopBridge.Helpers が必要 private static bool _isRunningAsUwp { get; } = (new DesktopBridge.Helpers()).IsRunningAsUwp(); // Windows のバージョン // ※ System.Management アセンブリへの参照追加が必要 private static Version _osVersion { get; } = (new Func(() => { using (var mc = new System.Management.ManagementClass("Win32_OperatingSystem")) using (var moc = mc.GetInstances()) foreach (System.Management.ManagementObject mo in moc) { var v = mo["Version"] as string; if (!string.IsNullOrWhiteSpace(v)) return new Version(v); } return new Version("0.0.0.0"); }))(); // 「タイムライン」が利用可能か? // 「タイムライン」 API が使えるのは、Win10 1709 (16299) 以降 // 「タイムライン」から呼び出してもらえるのは、今回はデスクトップブリッジでの動作時のみ public static bool IsTimelineAvailable { get; } = _isRunningAsUwp && (_osVersion >= new Version("10.0.16299.0"));
なお、「UWPアプリ化」したパッケージは16299以前にはインストールできないように作りましたから、上のコードからバージョン比較を行っている部分は削ってしまっても構いません。