Project

jpmobile

0.15
A long-lived project that still receives updates
A Rails plugin for mobile devices in Japan
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Runtime

~> 2.8.0
>= 0
 Project Readme

CI

jpmobile: A Rails plugin for Japanese mobile-phones

jpmobileとは

スマートフォン・タブレット特有の機能を Rails や Rack middleware で利用するためのプラグイン。以下の機能を備える。

  • スマートフォン・タブレットの判別
    • User-Agent による判別に加え、HTTP Client Hints (Sec-CH-UA-Mobile, Sec-CH-UA-Platform) による判別に対応。Client Hints が送信されている場合は User-Agent より優先して判定する。
  • Rails のビューへの自動振分け

他のバージョンの Rails については Versions : Jpmobile vs Rails を参照。

なお、フィーチャーフォン(ガラケー)関連の機能(キャリア判別、絵文字・文字コード変換、 位置情報・端末情報の取得、Trans SID、キャリアメール送受信など)は削除されました。

旧バージョンからのアップグレード

フィーチャーフォン関連機能の削除に伴い、以下の設定メソッドも削除されました。 config/initializers/jpmobile.rb などでこれらを呼び出していると NoMethodError が発生するため、アップグレード時に該当する設定を削除してください。

  • config.jpmobile.mobile_filter
  • config.jpmobile.form_accept_charset_conversion
  • config.jpmobile.smart_phone_emoticon_compatibility
  • config.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でインストールする場合

% 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

Client Hints による識別

モダンブラウザは 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
end

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 が最初に検索される。

iPad からアクセスすると、次の順でテンプレートを検索する。

  • index_tablet_ipad.html.erb
  • index_tablet.html.erb
  • index.html.erb

自動振り分けを無効化するには、アクションにおいて以下のように設定する。

def index
  disable_mobile_view!
end

アクション定義の省略

Rails では、アクション名に対応するテンプレートが存在する場合、アクション用のメソッド定義を省略できる。 しかし、端末向けテンプレートしか存在しないアクションの場合、jpmobile ではメソッド定義が必要になる。

class MyController < ApplicationController
  include Jpmobile::MethodLessActionSupport
end

Sinatra で使う場合

require 'jpmobile'
require 'jpmobile/sinatra'

class App < Jpmobile::Sinatra::Base
  use Jpmobile::MobileCarrier

  get '/' do
    erb :index
  end
end

jpmobileの開発方法

jpmobileの開発に関しては こちら へ

リンク

作者

Copyright 2006-2012 (c) Yoji Shidara, under MIT License.

Shin-ichiro OGAWA rust.stnard@gmail.com, Yoji Shidara dara@shidara.net