Develop with pleasure!

福岡でCloudとかBlockchainとか。

c2dm_on_railsでC2DM連携

Android2.2から追加された、サーバ上からAndroid端末にメッセージの通知を行えるC2DM(Cloud to Device Messaging )。

実際にAndroid端末にメッセージを送るのはGoogleのC2DMサーバなので、端末に送信したいメッセージをC2DMサーバに送信する必要がある。もちろんC2DMサーバにメッセージを送信するためには認証が必要な訳で、そういった認証・メッセージの送信をおこなうためのRails用のライブラリがpimeys/c2dm_on_rails · GitHub

簡単にc2dm_on_railsの使い方を書いとく。

まずは、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しておく必要があるので要注意。

てことで、事前のインストール&設定さえしてしまえば、c2dm_on_railsでさっくりメッセージが送れるのが良いね!