SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

UWPアプリ開発の最前線

簡単になったUWP Bridge
~Windows 10 1803の新機能「タイムライン」をWPFアプリに実装してみる

UWPアプリ開発の最前線 第6回


  • X ポスト
  • このエントリーをはてなブックマークに追加

タイル画像を作成する

 「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クラス内)。

「タイムライン」APIが利用できるかどうかの判定(その2)
// デスクトップブリッジで動作しているか?
// ※ 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以前にはインストールできないように作りましたから、上のコードからバージョン比較を行っている部分は削ってしまっても構いません。

次のページ
プロトコルアクティベーションへの対応

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10810 2019/11/10 21:18

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング