近くにいる人と写真を共有するアプリを作ってみました。参考元はAirDrop、あれ自体近くの人となのかはわかりませんが…写真を手軽に共有できるってのは魅力的だなと思い作ってみました。その技術的なことの紹介
アプリの名前はAirDropのリスペクトということでRaindropという名前で公開します。
プラットフォームについて
HTML+Java(+Ajax)で動作するため、iOS(iPhone, iPad, etc)やAndroid、そしてパソコンでも動作します。
アップロードに対応していればゲーム機でも動作すると思います。確認はしていませんが…
ちなみに、安全を確保するため、すべての通信はHTTPSで行われます。そのため、非常に複雑な処理をする必要が出てきますがここでは割愛。
そのため、IE非対応、リファラーがオンじゃないとまともに動作しません。
仕組み
さて、根本的な仕組みは非常に簡単です。受信モードをオンにすると、受信者の名前、位置情報、周りに表示するかのデータがサーバーへ送信され、待機リストに登録されます。
サーバーリソース
写真を共有する。ということでまず必要になってくるのはサーバーですね。サーバーに写真を送信し、受信モードをオフにしたら即消し。そうすることでサーバーリソースの消費を極限抑えます。
なので容量の少ないHDDでも5MBまでの写真に対応させました。これで送れない写真といえば一眼レフクオリティだと思います。
位置情報の利用&スムーズな受信
また近くの人とシェアできるという仕組み上、GPSを使用し、位置情報をサーバーへ送信します。
これは受信モードをオフにしたらすぐに情報が削除されるため、本当に待機の時しか情報が保管されません。また、受信モードをオンにすると、内部でセッションが作成され、ストリーミングにより常にクライアントへ何かしらのデータが送られます。
そのため、誰かが送信すると、すぐに「本当に受信しますか?」の画面が出てくるため、非常にスムーズな受信を可能にしています。
送信について
さて、そもそも相手がGPSが使えるかわかりませんし、もしかしたら誰かから既に受信リクエストを受けている場合もあります。
その場合はエラーを表示する必要がありますね。
送信にも受信と同じようにストリーミングによってセッションが割り当てられています。
そうすることで相手の状態をリアルタイムで知ることができますし、スムーズな動作をすることもできます。
あ、ついでに相手がGPSを使えなくても、相手の受信セッションのコードがわかれば直接リクエストを送れます。つまり相手が近くに居なくても正直送信できちゃうんですよね。
その際のサーバーリソース
さて、このようになんでもストリーミングにしてしまうと、HTTPリクエストによるサーバーリソースの消費も激しくなってしまいます。
それを防止するため、受信モード、送信モードを長時間付けれないようにしています。名目はセキュリティのためですが実際はサーバーリソースのためですね。
スナップショット
パソコンで動作させたスナップショット。全環境でこのような表示です。
一応スマートフォンに最適化
アプリの利用について
まだバグが多いですが試すことはできます。ご自由に試してどうぞ。ただ無理はさせないください。
Raindrop
https://secure.yryr.me/page/1002000001.html
すべて自己責任でお願いします。
今のところ(2015/1/13現在)、アカウントがなくても送信することはできます。