携帯電話特有の機能を Rails 3.0 や Rack middleware で利用するためのプラグイン。以下の機能を備える。
-
携帯電話のキャリア判別
-
端末位置情報の取得
-
GeoKit との連携
-
-
端末製造番号、契約者番号等の取得
-
IPアドレスの検証(キャリアが公開しているIPアドレス帯域からのアクセスか判定)
-
IPアドレスの検証には jpmobile-ipaddresses が必要です。
-
-
ディスプレイ情報(画面サイズ、ブラウザ画面サイズ、カラー・白黒、色数)の取得
-
ディスプレイ情報の取得には jpmobile-terminfo が必要です。
-
-
文字コード変換機能/絵文字のキャリア間相互変換
また Rails 3.0 に以下の機能を追加する
-
ビューへの自動振分け
-
位置情報取得などのリンクヘルパーの追加
-
セッションIDをフォーム/リンクに付与(Trans SID)
% rails plugin install git://github.com/jpmobile/jpmobile.git
% rails plugin install git://github.com/jpmobile/jpmobile-ipaddresses.git
% rails plugin install git://github.com/jpmobile/jpmobile-ipaddresses.git
% gem install jpmobile
% gem install jpmobile-ipaddresses
% gem install jpmobile-terminfo
環境変数 env にキャリアクラスのインスタンスが格納されています。また Rack::Request#mobile としても取得可能です。
case request.mobile when Jpmobile::Mobile::Docomo # for DoCoMo when Jpmobile::Mobile::Au # for au when Jpmobile::Mobile::Softbank # for SoftBank when Jpmobile::Mobile::Willcom # for Willcom when Jpmobile::Mobile::Emobile # for EMOBILE else # for PC end
あるいは
if request.mobile.is_a?(Jpmobile::Mobile::Docomo) # for DoCoMo end
<% if request.mobile? %> 携帯電話からのアクセスです。 <% else %> 携帯電話からのアクセスではありません。 <% end %> <% if request.smart_phone? %> スマートフォンからのアクセスです。 <% else %> スマートフォンからのアクセスではありません。 <% end %>
class PcController < ApplicationController before_filter :redirect_if_mobile def index end private def redirect_if_mobile if request.mobile? pa = params.dup pa[:controller] = "/mobile" redirect_to pa elsif request.smart_phone? pa = params.dup pa[:controller] = "/smart_phone" redirect_to pa end end end class MobileController < ApplicationController end
Rack::Request#mobile.position に位置情報が格納されます。
@latitude = request.mobile.position.lat @longuitude = request.mobile.position.lon
vandor/plugins/geokit以下にGeoKitがインストールされていると、Jpmobile::PositionにGeoKit::Mappableがincludeされる。したがって、
request.mobile.position.distance_to('札幌駅')
とすることで、端末と「札幌駅」との距離を求めることができる。詳細は geokit.rubyforge.org/api/index.html 参照。
端末側から通知されている場合、request.mobile.ident で契約に固有の識別子もしくは端末の製造番号を取得できる。両方存在する場合は契約に固有のIDが優先される。
-
契約に固有のID (request.mobile.ident_subscriber)
-
au: EZ番号(サブスクライバ番号)
-
DoCoMo: FOMAカード製造番号
-
EMOBILE: EMnet対応端末から通知されるユニークなユーザID
-
-
端末製造番号 (request.mobile.ident_device)
-
DoCoMo: 端末製造番号(FOMA, MOVA)
-
SoftBank: 製造番号
-
キャリアが公開しているIPアドレス帯域からのアクセスか判定する。
request.mobile.valid_ip?
ただし jpmobile-ipaddresses がインストールされていないか、スマートフォンの場合は必ずfalseとなる。
request.mobile.display で Jpmobile::Display クラスのインスタンスが返る。
画面幅 <%= request.mobile.display.width %> 画面高さ <%= request.mobile.display.height %>
ただし jpmobile-terminfo がインストールされていない場合はエラーとなるので注意が必要。
jpmobileを読み込むとDoCoMo、Au、SoftBankの絵文字を透過的に扱うことができる。
-
Rails の場合は vendor/plugins に配置し、下記の設定を追加することで有効になる。
# Rack middleware を追加するメソッドRails.application.config.jpmobile.mobile_filter
** 下記の設定を追加することで、<form> タグの accept-charset が変更される。
# <form accept-charset="Shift_JIS" ...> などに変更する Rails.application.config.jpmobile.form_accept_charset_conversion = true
携帯電話上では特に問題とならない。PCブラウザでテストする際に問題となるためのオプション。
-
Sinatra の場合は下記のように指定する。
$LOAD_PATH << ‘./lib/jpmobile/lib’ require ‘jpmobile’ require ‘jpmobile/rack’
use Jpmobile::Rack::MobileCarrier use Jpmobile::Rack::ParamsFilter use Jpmobile::Rack::Filter
get ‘/’ do
erb :index
end
Rails のみ半角・全角の自動変換フィルターが用意されている。用いるには
class MyController hankaku_filter end
と指定する。またtextareaやhidden/text/passwordのinputタグで半角に変換したくない場合は :input => true を指定する。
class MyController hankaku_filter :input => true end
Jpmobile内では、各キャリアの絵文字はUnicode私的領域上にマッピングされ、管理される。このとき、DoCoMo、Auは公式サイト記載のマッピングが使用される。ただしSoftBankはAuとの重複を避けるため、公式のマッピングに0x1000加算しU+F001以降に割り当てる。テンプレート内ではUTF-8でエンコードするか、数値文字参照の&#xHHHH;形式で指定する。
絵文字は送出時に内蔵の変換表に基づいて変換され、携帯電話のエンコーディングにあわせて送出される。携帯電話から受信した絵文字は上記マッピングに基づいてUTF-8でparamsに渡される。
-
DoCoMo、Auとの通信時にはShift_JIS、SoftBankとの通信時にはUTF-8が使用される。
-
:hankaku=>true指定時は、カタカナは半角カナに変換されて送出される。携帯電話から送られた半角カナは全角カナに変換される。
-
絵文字はキャリアにあわせて変換されて送出される。
-
携帯電話からの絵文字はUnicode私的領域にマップされ、UTF-8でparamsに格納される。
DoCoMo携帯電話からアクセスすると、
-
index_mobile_docomo.html.erb
-
index_mobile.html.erb
-
index.html.erb
の順でテンプレートを検索し、最初に見付かったテンプレートが利用される。Auの場合は、index_mobile_au.html.erb、Softbankの場合はindex_mobile_softbank.html.erbが最初に検索される。
またiPhoneからアクセスすると、
-
index_smart_phone_iphone.html.erb
-
index_smart_phone.html.erb
-
index.html.erb
の順でテンプレートを検索する。Androidの場合はindex_smart_phone_android.html.erb、Windows Phoneの場合はindex_smart_phone_windows_phone.html.erbが最初に検索される。
携帯専用サイトであれば、index.html.erbがなくとも問題ない。
以下のようなコードで、端末に位置情報を要求するリンクを出力する。
<%= get_position_link_to(:action=>:gps) %>
class MyController trans_sid end
class MyController trans_sid :always end
trans_sid 機能を使う場合には cookie session store を使用することができません。また Rails 3.0 では Cookie が使える場合にはそちらが優先されてしまうため、:always を指定した場合に問題になる場合があります。trans_sid を使用する際には、例えば config/initializers/session_store.rb で
Rails.application.config.session_store :active_record_store Rails.application.config.session_options = {:cookie_only => false}
として active_record_store を使用するように設定し、:cookie_only => false として Cookie を優先しないように設定します。このとき ApplicationController において protect_from_forgery の :secret を指定するか、あるいは protect_from_forgery を解除する必要があるでしょう。
また、
link_to "hoge", "/controller/action/id"
のようにリンク先を直接指定するとセッションIDは付加されません。
link_to "hoge", :controller => "controller", :action => "action", :id => "id"
のように指定する必要があります。
テストを実行するためには以下のgemパッケージが必要です。
-
rails (include rack)
-
sqlite3-ruby
-
nokogiri
-
rspec
-
rspec-rails
-
rspec-fixture
-
rack-test
-
mocha
-
geokit
Copyright 2006-2010 © Yoji Shidara, under MIT License.
Yoji Shidara <[email protected]>