
tvOS用のアプリ、Air Launcherをリリースしました。
このアプリは、手持ちのサーバーにある動画ファイルなどをAppleTVで閲覧するアプリです。
元々自分達用に作ってみたもので、いわゆる俺専アプリなのですが、配布もなにかと面倒なのでStoreへ出してしまえばダウンロードも楽だねということで、試しに出したら通ってしまったものです。
ですので、使える人だけ使ってもらえればということで、要望奴隷に服役する予定はありませんのであしからず。
いやぁ、AppleTV便利です。
HDMI連携でAppleTVのリモコン押せばTVの電源ONになって入力切替済み、スリープすればTVの電源も切れる。
自前のサーバーには録り貯めた録画ファイルなどが随時追加されているのですが、リモコンを2〜3タップすればすぐ見れると、快適になりました。
個人的にはこれがあるとないとではAppleTVの価値が1000倍は以上の差があるAir Launcher、これはサーバーを必要とします。
ホームページにはOSX, Windows,Linux, Raspberry Pi(同バイナリでLinkStationも動作確認済)等のサーバーアプリのサンプルがありますので、こちらでお試しになってください。
また、簡単なデモとして既存のサーバーにもサンプルを用意しました。
Air Launcherにて、nagisaworks.com/stv と入力すれば、少し色々なデモが閲覧できます。
このAir Launcher、実際のところは AppleTVでのブラウザアプリのようなものになっています。
概略だけ説明しますと、AppleTVには従来のiOSと同様のSwift/Obj-Cでのネイティブでの動作(Traditional App)と、もうひとつ、TVML, TVJSによる動作(Client-Server Apps)があります。
TVMLは Apple’s Television Markup Language、いわゆるtvOS用のXMLです。
TVJSはそれらを操作するJavaScriptとなります。
Webでいうと、HTMLとJavaScriptのようなものです。
これらはSwiftでUIWebViewを貼ったような感じで、混ぜても使用できます。
最近でいうとReact Nativeみたいな機構でしょうか。
ちなみにAppleTVにはいわゆるWebブラウザの機能はなく、代わりにこの機構が提供されているようです。
Air Launcherの本当の姿はTVML, TVJSを外部から読み込んで実行する機能を提供するアプリです。
ということは、細かいところを端折ると、Webにおけるサーバーとブラウザの関係と同様、XMLをサーバーから配信すればAir LauncherにてAppleTV上に自由にデータなどを表示できます。
AppleTVバンドルのMovie appやMusic app、その他ストアにあるであろう簡単な動画提供アプリなどはTVML,TVJSを利用しているようで、それらと同様の表現は大体Air Launcherを用いて実現できます。
WebのようにClient-Server構成に出来るということは、後から画面や表示内容をいくらでも変更できるということです。
ネイティブだと画面デザインを変えるとなるとコードでの修正&アップデートなど大変です。
また、じゃあ遅いのかなとか思ってしまうわけですが、DOM等は内部UIControlに直結していますので、テンプレートなどいくらか固定されてしまいますが、ほぼネイティブと同様の表現力があります。
メディアの再生はAppleTVのスペックのまま、mp3,m4a等の音楽やmp4等の動画再生、HLS(HTTP Live Streaming)も可能ですので駆使すればライブ配信も可能ですね。
Air LauncherにはXMLを直接読み込み再生などの若干の支援をする機能とJavaScriptを直接実行する二種類のモードを設けています。
通常はXMLモードでよいかと思いますが、さらに細かい処理をしたい場合は直接JavaScriptを使うことができます。
仕様についてはGitHubにサンプルとREADMEを置いておりますのでそちらを参照してください。
また、GitHubに置いているサーバーのサンプルはGo言語で書いてみました。
Goは自前でちゃんとしたHTTPサーバーもあり、クロスコンパイル機能で様々なDevice, OS用に単体バイナリが作れるので楽ですね。
所詮はHTTPサーバーですので、PHPでもRoRでもNode.jsでも、サーバー本体もなければそのへんのレンタルサーバーでも好きなものを使って頂ければ結構です。
サンプルや、TVML, TVJSなどAppleのドキュメントを参照して頂ければ大体はどういったものか分かってもらえるかと思いますが、かなり説明を端折ってしまいましたので、また細かく説明できる機会があればと思います。