スマートフォン・タブレット特有の機能を Rails や Rack middleware で利用するためのプラグイン。以下の機能を備える。
- スマートフォン・タブレットの判別
- User-Agent による判別に加え、HTTP Client Hints (
Sec-CH-UA-Mobile,Sec-CH-UA-Platform) による判別に対応。Client Hints が送信されている場合は User-Agent より優先して判定する。
- User-Agent による判別に加え、HTTP Client Hints (
- Rails のビューへの自動振分け
他のバージョンの Rails については Versions : Jpmobile vs Rails を参照。
なお、フィーチャーフォン(ガラケー)関連の機能(キャリア判別、絵文字・文字コード変換、 位置情報・端末情報の取得、Trans SID、キャリアメール送受信など)は削除されました。
フィーチャーフォン関連機能の削除に伴い、以下の設定メソッドも削除されました。
config/initializers/jpmobile.rb などでこれらを呼び出していると NoMethodError
が発生するため、アップグレード時に該当する設定を削除してください。
config.jpmobile.mobile_filterconfig.jpmobile.form_accept_charset_conversionconfig.jpmobile.smart_phone_emoticon_compatibilityconfig.jpmobile.session_store
また、以下の破壊的変更があります。
Jpmobile::Mobile::Docomo、Jpmobile::Mobile::Au、Jpmobile::Mobile::Softbankなどフィーチャーフォンのキャリアクラスが削除されました。これらを参照するとNameErrorが発生します。Jpmobile::Mobile.carriers=に削除済みのキャリア名を設定している場合も、キャリア判定時にNameErrorが発生します。- フィーチャーフォンの User-Agent では
request.mobileがnilになり、PC と同じ扱いになります。request.mobile?も falsey になります。 - gemspec の runtime 依存から
mailとscanfが外れました。これらに暗黙に依存していたアプリケーションでは、Gemfile に自分で追加してください。
% gem install jpmobile環境変数 ENV['rack.jpmobile'] に端末クラスのインスタンスが格納されています。
Rack::Request#mobile としても取得可能です。
case request.mobile
when Jpmobile::Mobile::Iphone
# for iPhone
when Jpmobile::Mobile::Android
# for Android
else
# for PC
endあるいは
if request.mobile.is_a?(Jpmobile::Mobile::Iphone)
# for iPhone
end<% if request.smart_phone? %>
スマートフォンからのアクセスです。
<% else %>
スマートフォンからのアクセスではありません。
<% end %>
<% if request.tablet? %>
タブレットからのアクセスです。
<% else %>
タブレットからのアクセスではありません。
<% end %>
class PcController < ApplicationController
before_action :redirect_if_smart_phone
def index
end
private
def redirect_if_smart_phone
return unless request.smart_phone?
new_params = params.dup
new_params[:controller] = '/smart_phone'
redirect_to new_params
end
end
class SmartPhoneController < ApplicationController
endモダンブラウザは Sec-CH-UA-Mobile / Sec-CH-UA-Platform ヘッダー(HTTP Client
Hints)を送信できる。jpmobile はこれらが存在する場合、User-Agent より優先して
端末判別に使用する。
Sec-CH-UA-Platform |
Sec-CH-UA-Mobile |
判定結果 |
|---|---|---|
"iOS" |
?1 |
Jpmobile::Mobile::Iphone |
"iOS" |
?0 |
Jpmobile::Mobile::Ipad |
"Android" |
?1 |
Jpmobile::Mobile::Android |
"Android" |
?0 |
Jpmobile::Mobile::AndroidTablet |
Jpmobile::MobileCarrier ミドルウェアはレスポンスに以下のヘッダーを付与し、
ブラウザに Client Hints の送信を要求する。
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform
初回リクエストでは Client Hints がまだ送信されないため、User-Agent による判別にフォールバックする。
ビューの自動振り分けを行うには、以下の設定が必要です。
class ApplicationController < ActionController::Base
include Jpmobile::ViewSelector
endiPhone からアクセスすると、次の順でテンプレートを検索し、最初に見付かったテンプレートを利用する。
index_smart_phone_iphone.html.erbindex_smart_phone.html.erbindex.html.erb
Android の場合は index_smart_phone_android.html.erb、Windows Phone の場合は
index_smart_phone_windows_phone.html.erb が最初に検索される。
iPad からアクセスすると、次の順でテンプレートを検索する。
index_tablet_ipad.html.erbindex_tablet.html.erbindex.html.erb
自動振り分けを無効化するには、アクションにおいて以下のように設定する。
def index
disable_mobile_view!
endRails では、アクション名に対応するテンプレートが存在する場合、アクション用のメソッド定義を省略できる。 しかし、端末向けテンプレートしか存在しないアクションの場合、jpmobile ではメソッド定義が必要になる。
class MyController < ApplicationController
include Jpmobile::MethodLessActionSupport
endrequire 'jpmobile'
require 'jpmobile/sinatra'
class App < Jpmobile::Sinatra::Base
use Jpmobile::MobileCarrier
get '/' do
erb :index
end
endjpmobileの開発に関しては こちら へ
Copyright 2006-2012 (c) Yoji Shidara, under MIT License.
Shin-ichiro OGAWA rust.stnard@gmail.com, Yoji Shidara dara@shidara.net