かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

REST API から Windows アプリの操作

Project Roma というのが発表されてもうかなりの時間がたちますが、UWP 同士では GA してて Android/iOS/Microsoft Graph API は Preview な感じです。Microsoft Graph API のカテゴリを見ると Cross-device experience という名前になってますね。

早く GA しないかな。

ということで、Microsoft Graph API は、ただの REST API です。 んで、Cross-device experience で提供されているのは、MS アカウントに紐づいているデバイスのリストの取得と、デバイスに対するコマンドの送信とコマンドの状態確認の API です。

流れとしてはデバイスのリストを取ってから、そこの ID を指定してコマンドを送り付けることになります。

デバイスのリストは以下のエンドポイントに GET で取れます。

https://graph.microsoft.com/beta/me/devices

コマンドは以下のエンドポイントに POST です。

https://graph.microsoft.com/beta/me/devices/デバイスのID/commands

どんな JSON が返ってくるかとかはドキュメントを見てみてください。

クロスデバイス エクスペリエンス - ドキュメント - Microsoft Graph

このコマンドですが以下のような JSON を送ると…

{
  "type": "LaunchUri",
  "payload": {
    "uri": "protocolname:?paramName=paramValue"
  }
}

protocolname に対応したプロトコルのアプリが起動します。プロトコルに対応するには UWP でさくっといけます。もちろん Desktop Bridge アプリも含まれるので WPF とかで作ったアプリを Windows アプリケーション パッケージ プロジェクトとかで appx にパッケージングすれば Microsoft Graph API から起動が出来ます。

ただ、残念ながら App Service をホストする方法が無さそう…。Windows アプリケーション パッケージ プロジェクトの Package.appxmanifest に AppService の定義をしてもダメだった。

ということでコマンドを受けるところは、純粋な UWP として別立てで作りました。なので、アプリとしては WPF 製の Desktop Bridge のアプリと App Service 用の UWP アプリが個別にインストールされます。 そして、UWP のほうの App Service に WPF 製アプリから繋いで、Microsoft Graph API 経由で来たメッセージを渡してもらって、結果として REST API (Microsoft Graph API) から遠隔操作みたいな感じで動きます。

動作は以下のような感じ。Microsoft Graph API は API 確認用の Microsoft Graph Explorer から叩いています。

youtu.be

まとめ

つまり、Android や iOS 向けには SDK が提供されている Project Roma ですが、それ以外のプラットフォームでも Microsoft Graph API を叩けばアプリを起動したり、コマンドを送り付けたりすることが出来るってことです。

ソースコードは以下のリポジトリにあげてます。

github.com

あ、因みに Microsoft Graph API 使わなくても自前で何か常住プロセス立ててサーバーと通信するようなのを作れば同じことは出来るけど、最近は常駐系のアプリ作りにくい (ストアに出す場合の話し) ので自前で用意しないほうが幸せかも。