iOS/Android から Mac へ、ブラウザ経由でファイルを転送できる macOS アプリを作った

はじめに

アプリ開発中にデバッグで気になった画面をスクショに撮って Mac に送りたい場面が頻繁にあります。iPhone なら AirDrop でなんとかなりますが、Android 端末はそうもいきません。最近の Pixel は AirDrop 相当の機能が使えるようになってきたそうですが、ニッチな端末だとまだ難しいことも多いです。

USB ケーブルを使う方法もありますが、手元にないと詰みます。クラウドストレージ経由だとアップロードとダウンロードの 2 ステップが発生します。iOS でも Android でも同じ操作でファイルを Mac に送れる仕組みが欲しくて作ったのが FluffDrop なので紹介したいと思います。

仕組み

Mac 側で HTTP サーバーを立て、そのアドレスを QR コードにします。スマホのカメラで読み取るとブラウザが開き、そこからファイルを選んで送信するだけです。送信側に専用アプリのインストールは不要で、OS 標準のカメラとブラウザだけで完結します。

FluffDrop のアーキテクチャ

Mac 側は SwiftUI の MenuBarExtra を使ったメニューバーアプリとして常駐させています。HTTP サーバーは Swift Concurrency ネイティブの FlyingFox を使いました。QR コードは CoreImage でオフライン生成し、サーバー起動と同時に表示します。

仕上がり

Mac 側のポップオーバーはこんな見た目です。サーバーが動いている間、QR コードと IP アドレスが表示されます。

FluffDrop のポップオーバー

iPhone でカメラアプリを開いて QR を読み取ると、そのままブラウザでアップロード画面が開きます。

iPhone でブラウザを開いた画面

ファイルを選んで送信するだけです。テキストを直接入力して .txt ファイルとして送ることもできます。

iPhone でファイルを選択する画面

まとめ

以前 Mimicry を作った際に、同一サブネット上の Mac でプロキシサーバーを立て、デバイスの通信を中継してモックレスポンスを返すアプローチに触れていたことが、今回の着眼点につながった気がします。

HTTP サーバーと QR コードを組み合わせることで、送信側をプラットフォーム非依存にできました。同一サブネットにさえいれば iPhone でも Android でも PC でも送れます。業務でもいかしていきたいと思います。