AppInstallerによる更新
Windows 10 バージョン 1709 から、UWPアプリケーションをAppInstallerによってサイドローディングするとアプリの自動更新が利用できる。
この機能は IoT Core でも利用が可能で、サイドローディングした(というかストアインストールではない)アプリをAppInstallerに自動更新させることができる。
デバイスポータルからのインストール時
App managerからアプリをインストールする際に、*.appinstallerファイルを指定すれば自動更新される状態となる。
appx/msix/bundleなどを直接指定してインストールした場合には自動更新にはならない。
カスタムFFUでのプリインストール時
Update apps on your Windows 10 IoT Core devices を見る限り、OMA-DMを利用するのが正攻法のように見える。(通常はAzureを利用するのだろうか。)
しかし閉じた環境で行いたかったのと、OMA-DMのサーバは簡単に用意できるようなものでもなさそうなので、appinstallerを利用してどうにかできないかを試みた。
IoT Core manufacturing guide に説明されているカスタムFFUイメージのビルド手順にて、自分のアプリをイメージに追加する箇所でappinstallerファイルを指定することはできない。
カスタムFFUイメージの初期状態で自動更新を有効にすることは今のところできないように思われる。
(ICDでプロビジョニングパッケージの構成ができないか探したが見つからない。なにか方法があれば知りたい。)
一応、以下のような方法でプリインストールアプリをAppInstallerの管理に置き換えることはできる模様。
公式にサポートされた方法かどうかはわからないので、とりあえずこれをしたら出来た、という状態。
- アプリに
packageManagement
の機能要求を追加する。- この機能要求は Restricted capabilities という種類のもので、appxmanifestファイルを手編集して名前空間やIgnorableNamespacesへの追加等必要となる。
- アプリになにかの方法で自身のパッケージを示す appinstaller のURIを含めておき、初回起動時などに PackageManager.AddPackageByAppInstallerFileAsync() を呼び出してappinstallerからインストールを行う。
- アプリケーションパッケージのバージョンが新しければ更新が行われる。(
ForceTargetAppShutdown
を指定すれば呼び出した時点でアプリ再起動が行われる。) - アプリパッケージのバージョンが同じ場合は呼び出しは失敗(例外発生)する。(たぶん古い場合も同様と思われる)
- アプリの起動直後にこのメソッドを呼び出した場合にも失敗することがあるように思われる。(遭遇ケースが少なくて不確か)
- 少なくともPackage.GetAppInstallerInfo()はアプリ起動直後に呼び出すとエラーを生ずることは確か。
- アプリケーションパッケージのバージョンが新しければ更新が行われる。(
- 自身の更新に成功したら、以後はAppInstallerが自動更新してくれる。
その他
-
PackageManager.UpdatePackageAsync()による自身の更新も可能である。
- しかし、更新対象パッケージのURIの特定や依存パッケージなども指定が必要のため、appinstallerファイルのようなものでパッケージ構成情報を得て処理するような、まさにAppInstallerの動作を自分で実装しないといけなそう。