Install

sudo gem install rack-mobile-detect

In your code:

require 'rack/mobile-detect'

Overview

Rack::MobileDetect is Rack middleware for ruby webapps that detects mobile devices. It adds an X_MOBILE_DEVICE header to the request if a device is detected. The strategy for detecting a mobile device is as follows:

Targeted Detection

Search for a 'targeted' mobile device. A targeted mobile device is a device you may want to provide special content to because it has advanced capabilities - for example and iPhone or Android phone. Targeted mobile devices are detected via a Regexp applied against the HTTP User-Agent header.

By default, the targeted devices are iPhone, iPad, Android and iPod. If a targeted device is detected, the token match from the regular expression will be the value passed in the X_MOBILE_DEVICE header, i.e.: X_MOBILE_DEVICE: iPhone

UAProf Detection

Search for a UAProf device. More about UAProf detection can be found here.

If a UAProf device is detected, it will have X_MOBILE_DEVICE: true

Accept Header Detection

Look at the HTTP Accept header to see if the device accepts WAP content. More information about this form of detection is found here.

Any device detected using this method will have X_MOBILE_DEVICE: true

Catchall Detection

Use a 'catch-all' regex. The current catch-all regex was taken from the mobile-fu project

Any device detected using this method will have X_MOBILE_DEVICE: true

Notes

If none of the detection methods detect a mobile device, the X_MOBILE_DEVICE header will be absent.

Note that Rack::MobileDetect::X_HEADER holds the string 'X_MOBILE_DEVICE' that is inserted into the request headers.

Usage

use Rack::MobileDetect

This allows you to do mobile device detection with the defaults.

use Rack::MobileDetect, :targeted => /SCH-\w*$|[Bb]lack[Bb]erry\w*/

In this usage you can set the value of the regular expression used to target particular devices. This regular expression captures Blackberry and Samsung SCH-* model phones. For example, if a phone with the user-agent: 'BlackBerry9000/4.6.0.167 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/102' connects, the value of X_MOBILE_DEVICE will be set to 'BlackBerry9000'

use Rack::MobileDetect, :catchall => /mydevice/i

This allows you to limit the catchall expression to only the device list you choose.

Redirects

use Rack::MobileDetect, :redirect_to => 'http://m.example.com/'

This allows you to choose a custom redirect path any time a mobile device is detected.

use Rack::MobileDetect, :targeted => /BlackBerry|iPhone/,
                        :redirect_map => { 'BlackBerry' => 'http://m.example.com/blackberry',
                                           'iPhone' => 'http://m.example.com/iphone' }

This allows you to map specific redirect URLs to targeted devices. The key in the redirect_map should be the value of the matched pattern.

use Rack::MobileDetect, :targeted => /BlackBerry|iPhone/,
                        :redirect_map => { 'BlackBerry' => 'http://m.example.com/blackberry',
                                           'iPhone' => 'http://m.example.com/iphone' },
                        :redirect_to => 'http://m.example.com/'

This allows you to map targeted devices to specific URLs. Non-targeted mobile devices will redirect to the url specified by redirect_to.

In the example above, BlackBerrys and iPhones get redirected to device-specific URLs. All other mobile devices get redirected to 'http://m.example.com'.

Utils

A Sinatra app called echo_env.rb is available in the util/ directory. Hit this app with a mobile device to see the various HTTP headers and whether or not the X_MOBILE_DEVICE header is added by Rack::MobileDetect.

See the unit test source code for more info.