Android2.2から追加された、サーバ上からAndroid端末にメッセージの通知を行えるC2DM(Cloud to Device Messaging )。
実際にAndroid端末にメッセージを送るのはGoogleのC2DMサーバなので、端末に送信したいメッセージをC2DMサーバに送信する必要がある。もちろんC2DMサーバにメッセージを送信するためには認証が必要な訳で、そういった認証・メッセージの送信をおこなうためのRails用のライブラリがpimeys/c2dm_on_rails · GitHub。
まずは、gemのインストール。(ちなみにc2dm_on_rails自体、c2dm、configuration, gdataってgemに依存してるので、予めインストールしとく必要がある。)
gem install c2dm_on_rails
つづいて、Railsのenvironments.rbに
config.gem "gdata" config.gem "configatron" config.gem 'c2dm_on_rails'
を追加しとく。
また、RAILS_ROOT直下のRakefileに以下のコードを追加。このコードを追加しないと次のgenerateで「Missing these required gems: c2dm_on_rails」とかエラーになる。
begin require 'c2dm_on_rails_tasks' rescue MissingSourceFile => e puts e.message end
続いて、c2dm_on_railsが使用するテーブルを作成するためのマイグレーションファイルを生成する。
ruby script/generate c2dm_migrations
↑の結果c2dm_devicesとc2dm_notificationsというテーブルを生成するマイグレーションファイルが生成されるので、適宜rake db:migrateしとく。
あとc2dm_on_railsはgdataライブラリを使ってGoogle accountにアクセスするみたいなんだけど、そのGoogleアカウントの情報をconfig/c2dm.ymlに定義する。
development: username: your_user_name password: password_for_the_account app_name: your_applications_name production: ... etc
以上で、準備完了。お次は使い方。
まずは、端末の登録。AndroidのクライアントあぷりからC2DMへの登録をした際に生成されたregistration_idをWebアプリ側にも通知しする必要がある。AndroidのクライアントはC2DMサーバからregistration_idを受け取ったら、その値をWebアプリにも投げ、Webアプリの任意のコントローラでデバイス情報を↓のように登録する。
C2dm::Device.create(:registration_id => params[:registration_id])
続いて、端末へのメッセージの送信↓。
notification = C2dm::Notification.new notification.device = device # C2dm::Device.createで作成したメッセージを送信する端末のオブジェクトを指定 notification.collapse_key = "private_message" notification.delay_while_idle = true notification.data = {"sender_id" => "420", "message_text" => "Wanna go for a ride?"} notification.save
でこの段階だとc2dm_notificationsテーブルにデータが登録されただけなので、実際のメッセージは送信されない。メッセージを送信するには、
rake c2dm:notifications:deliver
とrakeを実行する必要があるんだけど、↑のc2dm_notificationsデータ生成と同時に配信したいので、↑のコードの後に
C2dm::Notification.send_notifications
ってコードを追記する。結局rakeタスクの中でやってることもC2dm::Notification.send_notificationsを呼び出してるだけ。このメソッドを実行するとC2DMサーバに対してメッセージが投げられ、端末側にC2DMサーバからメッセージが通知される。
実際にAndroidにメッセージが届くとちょっと感動w。
ちなみにC2DMサーバへ上記のようなWebアプリからメッセージを送信する際は、事前にAndroid Cloud to Device Messaging Framework - Android — Google Developersへsign upしておく必要があるので要注意。