GCM登録用サーバの製作

前回製作したGCM (Google Cloud Messaing) のサンプルでは、スタンドアロンで動くRubyスクリプトからメッセージを送信していました。本来期待されるべき作りとしては、以下のような機能を持つサーバアプリケーションが必要になります。

  • GCMサーバからAndroidアプリに発行されたRegistration IDを受け取り、保存する処理
  • 保存したRegistration IDを使ってGCMサーバにメッセージを投入する処理

今回は前者の方をRailsを使って製作しました (前半の登録部分のみ)。
特に変わったことはしていないと思いますが、Railsあまり慣れていないので手間取りました…

前提としたバージョンは以下の通りです。

サーバアプリが受け取るリクエス

Androidアプリーサーバアプリ間のインタフェースは自由に決められるので、ここは以下のように設計しました。

  • http://ドメイン名/devices/register にHTTP POSTを送信
  • HTTPリクエストボディ (form形式) で、デバイス名 (device_id) とRegistration ID (registration_id) を渡す
  • HTTPレスポンスとして、登録内容がJSON形式で返される

モデル

先ほどのリクエストに登場するdevice_idとregistration_idのほかに、コメントを記述するためのdescriptionを設けています。
gcm_app_server/app/model/device.rb:

class Device < ActiveRecord::Base
  attr_accessible :description, :device_id, :registration_id
end

コントローラ

HTTP POSTのリクエストボディとして受け取ったdevice_id, registration_idからDeviceオブジェクトを作成し、DBに保存します。

ここでのややはまりは、

  • Railsのnewアクションから遷移した場合と直接HTTP POSTを投げた場合でparamsのキーが変わる (前者では、"device_" のようなprefixがつく)
  • render :json => オブジェクト とすることで、HTTPレスポンスをJSON形式で返せる

gcm_app_server/app/controller/DevicesController:

class DevicesController < ApplicationController
  # 登録済みRegistration IDの一覧
  def index
    @devices = Device.all
  end

  # Registration IDの登録
  def register
    reg_id = params[:registration_id]
    dev_id = params[:device_id]
    @device = Device.create(:device_id => dev_id,
                :registration_id => reg_id,
                :description => "")
    render :json => @device
  end
end

ビュー

メインの登録用アクション (register) はビューを持ちませんが、一応一覧表示用アクション (index) のビューを貼っておきます。

gcm_app_server/app/views/devices/index.html.erb:

<h1>デバイス一覧</h1>

<table class="devices">
  <tr>
    <td>#</td>
    <td>Device ID</td>
    <td>Registration ID</td>
    <td>Description</td>
  </tr>
  <% @devices.each do |device| %>
  <tr>
    <td><%= device.id %></td>
    <td><%= device.device_id %></td>
    <td><%= device.registration_id %></td>
    <td><%= device.description %></td>
  </tr>
  <% end %>
</table>

試行錯誤の後がいろいろ含まれていますが、一応indexのスクリーンショット