Wykrywanie przeglądarek na urządzenia mobilne

Author: Wojtek Sznapka (wojciech.sznapka) | maj 18th, 2010
avatar

Często bywa  tak, że chcemy utworzyć mobilną wersję naszego serwisu. Cechuje się ona przeważnie skromniejszą szatą graficzną oraz umiarem w wykorzystaniu JavaScriptu. Aby wykryć przeglądarkę mobilną (używaną w telefonach komórkowych, smartphone lub palmtopach) wystarczy użyć poniższej klasy. W zaprezentowanym rozwiązaniu detekcja przeglądarki oparta jest o nagłówek HTTP_USER_AGENT lub o dodatkowe nagłówki wysyłane przez niektóre przeglądarki.

class MobileBrowserDetector
{
  private static $mobileAgentPrefixes = array(
    'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
    'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
    'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
    'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
    'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
    'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
    'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
    'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
    'wapr','webc','winw','winw','xda','xda-'
  );

  private static $mobileAgentParts = array(
    'up.browser', 'up.link', 'mmp', 'symbian', 'mobile safari',
    'opera mobi', 'android', 'smartphone', 'midp', 'wap', 'phone'
  );

  public static function isMobile($userAgent = '')
  {
    if (!strlen($userAgent)) {
      $userAgent = $_SERVER['HTTP_USER_AGENT'];
    }
    $isMobile = false;
    $isMobile |= in_array(strtolower(substr($userAgent, 0, 4)), self::$mobileAgentPrefixes);
    $isMobile |= preg_match(sprintf('#(%s)#i', implode('|', self::$mobileAgentParts)), $userAgent);
    $isMobile |= strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml') !== false;
    $isMobile |= isset($_SERVER['HTTP_PROFILE']);
    $isMobile |= isset($_SERVER['HTTP_X_WAP_PROFILE']);
    $isMobile |= isset($_SERVER['ALL_HTTP']) && strpos(strtolower($_SERVER['ALL_HTTP']),'OperaMini') !== false;
    return (bool)$isMobile;
  }
}

Możemy łatwo użyć tej klasy na przykład w projekcie symfony, podmieniając główny layout na layout mobilny (apps/APLIKACJA/templates/layout_mobile.php) w filtrze, w poniższy sposób.
Zawartość apps/APLIKACJA/config/filters.yml

rendering: ~
security:
  class: sfGuardBasicSecurityFilter
mobile:
  class: MobileFilter
cache:     ~
common:    ~
execution: ~

Klasa filtra lib/MobileFilter.class.php:

class MobileFilter extends sfFilter
{
  public function execute($filterChain)
  {
    if (MobileBrowserDetector::isMobile()) {
      $this->getContext()->getActionStack()->getFirstEntry()->getActionInstance()->setLayout('layout_mobile');
    }
    $filterChain->execute();
  }
}

Tags: , ,

Podyskutuj na ten temat:

4 Responses to “Wykrywanie przeglądarek na urządzenia mobilne”

  1. [...] Więcej: Wykrywanie przeglądarek na urządzenia mobilne | xlab [...]

  2. Pisanie aplikacji na urzadzenia mobilne znacznie latwiej oprzec o dany zestaw przegladarek, ktore sa kompatybile z prawie wszystkimi telefonami. Latwiej zapewnic zgodnosc z XHTML anizeli zgodnosc dla natywnych przegladarek dla iPhone czy platforme Androida. Rozwijajac jedna wersje mozna dac gwarancje, ze bedzie wersja mobilna dziala na wielu telefonach.

  3. @Do przedmówcy: Po części masz rację, ale zauważ, że w przypadku chociażby takiego Iphone’a, można przygotować serwis wykorzystujący funkcjonalność tego urządzenia i stworzyć dedykowany dla niego interfejs graficzny spójny wizualnie z jego OS-em (walor estetyczny i dotyczący użyteczności). Możemy także obsługiwać wbudowane animacje i akcelerometr z poziomu samego JavaScriptu. Dodatkowo Safari Mobile ma wbudowaną funkcję geolokalizacji dostępną w HTML5, co może znaleźć wiele ciekawych zastosowań w przypadku aplikacji webowych dla urządzeń mobilnych (na razie poza wspomnianą przeglądarką ta funkcjonalność jest dostępna jedynie w Firefoksie). Ponadto, w tradycyjnych wersjach serwisów często pojawia się natłok sporej ilości informacji na dzień dobry, na co nie można sobie pozwolić w przypadku serwisów mobilnych ze względu na ograniczoną rozdzielczość wyświetlacza w telefonach i palmtopach.

  4. avatar Kris pisze:

    Witam,
    skrypt nie działa pod iPadem

Leave a Reply