Dropbox アカウントひとつで利用できるプッシュ通知機構
2018年6月追記: Dropbox API の仕様変更により以下の内容はすでに obsolete です。記事は残しますが、過去の情報であることをご了承下さい。
Dropbox 社は広く知られるファイル系のサービスとは別に 2013年より非ファイル形式の構造化データの保存・読み出しに対応するデータストアサービスを公開しており、Dropbox アカウントを持っていれば Dropbox Datastore API 経由でこのサービスを利用できます。同 API は全体的にシンプルで SDK のサポート範囲も広いため自作のソフトウェアへ手軽に組み込むことが可能です。
自前でサーバ環境を構築・運用する手間なしにレコードイメージのデータをネットワークストレージ上で取り回せるのは便利で、また多くの人がアカウントを持っていることへの安心感もあり、この Dropbox のデータストアサービスはさまざまな用途に柔軟に活用できそうです。
Dropbox データストアの弱点としてストア上のデータのアカウント間での共有に未対応である点がしばしば挙げられていましたが、2014年9月に同社は New Datastore features! として Shared datastores のリリースをアナウンスしています。
Dropbox Datastore API のデータ変更通知機能
Dropbox Datastore API はアプリケーションをオフラインで操作した後のデータの自動同期や競合の解決を行うための機能や、ストア上のデータに変化があった際にそれをアプリへ通知するといった BaaS(Backend as a Service)風味の機能を備えています。
後者はリスナとして登録した所定の関数をデータ変更発生時に API がコールバックするしくみで、そこでの通知を適切にハンドリングすることによりあるインスタンスが行ったデータ変更を他のインスタンスへすみやかに反映することが可能です。その実装例を Dropbox Datastore API の JavaScript SDK 付属のサンプルアプリケーションで試すことができます。公式のリンクを以下に掲載します。
最初に表示される「Link to Dropbox」ボタンを押下して自分の Dropbox アカウントでログインすると UI が開きます。二台の PC の web ブラウザを使って操作を行うとわかりやすいでしょう。
※このアプリはログインしたアカウントのデータストア以外にはアクセスしません
データストアの通知機構を単体で使用?
サンプルアプリの動きはなかなか面白く新鮮に感じられました。反応も早くストアからの変更通知がアプリ内で適切に処理されている様子が見てとれます。
ところで、「データに変更が発生したら変更内容をクライアントへ知らせる」という通知のしくみはこのデータストアの機能の構成要素のひとつとして用意された独自の機構であるわけですが、その部分は単独でも実用性があるように思いました。つまり、データストアを本来の記憶領域として使うことよりも、そこでのプッシュ通知のしくみを利用することを主目的とするアプリケーションもあり得るのではないかということです。
単にストア上のデータを更新すれば通知処理が発動するシンプルさも好ましく、送信側は伝えたいメッセージの内容を所定のテーブルのレコードにデータとして乗せることでトリガーを送り、通知を受けた側はその内容に応じて所定の処理を行う形にすればよさそうです。もちろん機能的には専用のプッシュ通知機構に及びませんがメッセージの送受信さえできればあとはアプリ側の工夫次第でしょう。
わざわざそんなことをしなくても所定のプラットフォームのスタンダードな通知機構を使えばよさそうなものですが、そういうことを考えたのには理由があります。プッシュ通知というものはごくプライベートな用途で使いたい場合もあります。たとえば、以前 Android の標準のプッシュ通知機構である GCM を利用して 自宅の遊休端末を留守中の監視カメラや Wake on Lan マジックパケット発信器として遠隔操作するためのアプリを手がけたことがあります。通知は正しく機能したものの、GCM はこういう小さな要件に軽く使うには必要な手順や手続きにいささか牛刀の感があり、処理用の中間サーバやサーバ用のコードなども面倒に思いながら仕方なく用意していました。
だからと言って自分で似たしくみを作ることは保守・運用面で良い判断とも思えず、よくわからないサードパーティ製品に依存するのも気が進みません。あまり切実でも緊急でもないもののそういう緩いジレンマが時おり首をもたげていたのです。そんなわけで、なるべく手間をかけずシンプルに通知をハンドリングできるものがあればと思っていました。
探せば他にも便利で面白いものが色々ありそうですが、別件でたまたま触れた Dropbox Datastore API の通知のしくみはちょうどそこにあてはまる気がしました。広範なプラットフォームで利用できることにも夢があります。
ブラウザ用アプリを試作
そんなわけで、まずは JavaScript サンプルを土台に手軽に実行できるブラウザ用アプリを作ってみることにしました。「URL プッシュ機能つきオンラインブックマークアプリもどき」とでも言うべきものです。
ブラウザで下記の URL を開き Dropbox アカウントでログインすれば動かしてみることができます。もちろん自分のデータストア以外には一切アクセスしません(と言うかできません^^;)のでご安心下さい。
使い方を図に示します。「選択されたページをこのブラウザで開く」ボックスをチェックしておくと、自分を含むいずれからのインスタンス上で「選択」または「追加」された URL が現在のブラウザで開かれます。
ブラウザ版の動作の様子(動画 39秒 無音)
Android 用アプリも試作
手元での使用頻度の高い Android 端末用にもアプリを作ってみました。インストール用の QR コードを掲載します。
http://dsas.blog.klab.org/data/notifyit/NotifyIt.apk
GitHub - NotifyIt - android/NotifyIt
使い方を図に示します。
Android 版は受信専用です。「通知への待機を開始」ボタンを押下すると自前のサービスが起動し待機状態へ移行します。サービスはシステムから強制終了されにくいフォアグラウンドサービスとしており稼動中は端末の通知領域にアイコンが常駐します。サービスを停止するには「通知への待機を停止」ボタンを押下します。
Android 版への通知はブラウザ版から行います。待機状態の Android 版は通知を受信すると次のように振舞います。
- 通知内容が http(s)://... の形式なら URL とみなしブラウザへ渡す
- それ以外なら Android 標準の am (activity manager) コマンドへのパラメータとみなし内容を整形して同コマンドへ渡す
Android 版の動作の様子(動画 60秒 無音)
付録:am コマンド書式とパラメータ記述例
$ am usage: am [subcommand] [options] start an Activity: am start [-D] [-W] <INTENT> -D: enable debugging -W: wait for launch to complete start a Service: am startservice <INTENT> send a broadcast Intent: am broadcast <INTENT> start an Instrumentation: am instrument [flags] <COMPONENT> -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT) -e <NAME> <VALUE>: set argument <NAME> to <VALUE> -p <FILE>: write profiling data to <FILE> -w: wait for instrumentation to finish before returning start profiling: am profile <PROCESS> start <FILE> stop profiling: am profile <PROCESS> stop start monitoring: am monitor [--gdb <port>] --gdb: start gdbserv on the given port at crash/ANR <INTENT> specifications include these flags: [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>] [-c <CATEGORY> [-c <CATEGORY>] ...] [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...] [--esn <EXTRA_KEY> ...] [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...] [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...] [-n <COMPONENT>] [-f <FLAGS>] [--grant-read-uri-permission] [--grant-write-uri-permission] [--debug-log-resolution] [--activity-brought-to-front] [--activity-clear-top] [--activity-clear-when-task-reset] [--activity-exclude-from-recents] [--activity-launched-from-history] [--activity-multiple-task] [--activity-no-animation] [--activity-no-history] [--activity-no-user-action] [--activity-previous-is-top] [--activity-reorder-to-front] [--activity-reset-task-if-needed] [--activity-single-top] [--receiver-registered-only] [--receiver-replace-pending] [<URI>]パラメータ記述例
- start -n jp.klab.nopass/.MainActivity
- 指定されたアプリのアクティビティを開く - start -a android.intent.action.VIEW -d geo:0,0?q="枕崎市"
- 指定された場所をマップで表示 - start -a android.intent.action.VIEW -d tel:000000000
- 指定された電話番号の発呼準備 - start -a android.intent.action.SENDTO -d mailto:nobody@example.com --es android.intent.extra.SUBJECT テスト --es android.intent.extra.TEXT インテント経由でメールを作ってみたり
- 指定された宛先・件名・本文の新規メールを生成 - start -a android.intent.action.VIEW -d vnd.youtube:qpjw62OK9Tw
- 指定された動画を Youtube で再生
余談ながら、、
今回掲載したアプリ「NotifyIt」は Dropbox 社による事前審査を通過しています。
(tanabe)