iOS/Android アプリを簡単かつ複数の端末にインストールできる Mac アプリ、TransporterPad をリリースしました。
iOS/Android アプリの実機転送は公式の TestFlight などや、DeployGate といった OTA 配信の仕組みが使われることが多くなっています。しかし、そのような環境を構築できない場合もあります。そのときは USB をつないでの転送をすることになりますが、この方法だとエンジニア以外にはハードルが高く、デザイナーやマネージャーが新しいビルドを試しづらい環境だと思います。
また、テスターが複数の実機を横に並べてテストする際、そのインストールは大変な手間となってしまいます。
TransporterPad は、そんな非エンジニアの USB 経由アプリインストールを強力にサポートします。
使い方
使い方はとっても簡単。XcodeやAndroid Studioのインストールも不要です。
- USB で端末をつなぐ。
- IPA ファイル / APK ファイルを TransporterPad のウィンドウにドロップする
- 認証がかかっていない URL であれば、ブラウザからリンクを直接ドロップすることもできます。
Beam UP!
ボタンをクリックする
これだけで、Mac につながっている端末すべてにアプリがインストールされます。USB ハブと USB ケーブルをたくさん用意する必要があるかもしれませんが、そうさえすれば複数台のインストールもワンクリックで勝手にやってくれます。
ライセンス
はじめて GPL を適用しました。ソースコードは GitHub で公開しています。Pull Request なども英語だろうが日本語だろうが大歓迎です。
なぜ GPL なのかというと、内包している実機転送ツール ios-deploy のバイナリそのもの、そしてそこからいただいてきた Apple のプライベートフレームワークのヘッダファイルが GPL だから、ということになります。*1
しくみ
- iOS は Unity で使われている ios-deploy、Android は adb がアプリの中に内蔵されていて、これらのフロントエンドとして動作しています。
- ios-deploy は transporter_chief.rb で使われていた fruitstrap の Unity フォークです。
- 端末の検出は IOKit を使っています。詳しいお話はmacOS で USBデバイスの抜き差しを検出するで書いたとおりです。
- iOS 端末の名称取得は Apple のプライベートフレームワーク MobileDevice.framework を使って取っています。この部分は ios-deploy が持っていたヘッダファイルを使ってメソッドを参照しています。
- パッケージ名の取得は、iOSは Info.plist から直接取れますが、Android は zipalign のためそのまま読めないため、デコードしています。
感謝の言葉
- このツールの元々の着想は How to deploy iOS apps to the iPhone via the command line というページに掲載されていた transporter_chief.rb からきていて、社内で作っていたバージョンはこのスクリプトを大きく改造したものを内包していました。 Thanks a lot for Holger!
- デザイン全般を快く引き受けてくれた同僚のデザイナー はやかわ さんに感謝します。最初はアイコンだけだったはずが、画面をお見せしたところデザインスペックまでをいただきまして、ちゃんとした macOS アプリを作ったなという気持ちになれました。
その他の感想
自身初の Mac アプリ、そして 6 年ぶりの新作となります。
元々このツールは社内でデザイナーさんがデザインテストする際に Jenkins からバイナリ拾ってきてインストールできるよう、MonoMac で作っていたものでした。当時は1回ごとに転送ボタンを押さないといけなかったのですが、QA さんが大量に端末抱えてデスクに向かっていくところを見て、いつか一括転送できるものを、しかも一般に公開したいと思っていました。
元々は MonoMac で書かれていたツールですので、Xamarin.Mac でやることも検討しましたが、Swift3 をしっかり使ってみたいという気持ちの方がかちました。どちみち、IOKit を使っている時点で Xamarin.Mac は茨の道だというのは以前平野さんもお話しされていたので、良い選択だったと思っています。
Swift でも C っぽいところはつらかったので、Objective-C で書くことにしたのですがそこはライブラリにして、アプリ側からはそれを参照することで、アプリ本体のコードは Swift のみになるようにしました。
Storyboard が使えるようになっているおかげで、iOS と全く同じように開発することができるなと思っていましたが、難しいことをしなければ、既存の iOS 開発の知識で簡単に Mac アプリが作れるという感覚があり、かなり楽しい開発でした。しかし、Cocoa Binding はなれるまで辛かった…
また、今後も Mac アプリは取り組んでいきたいとおもいます。