Как определить, является ли это мобильным устройством с PHP?

Я пишу сайт на PHP. Поскольку для доступа к Интернету кому-либо из сети потребуется доступ к нему, я должен создать мобильную версию. Как лучше проверить, мобильное ли это устройство? Я не хочу иметь заявление о переключении с 50 устройствами в конце, так как я не только хочу поддерживать iPhone.

Есть ли класс PHP, который я мог бы использовать?

11 ответов

Решение

Вам необходимо проверить несколько заголовков, которые отправляет клиент, например, USER_AGENT и HTTP_ACCEPT. Посмотрите эту статью, чтобы узнать подробный сценарий обнаружения мобильных пользовательских агентов на PHP.

Вы должны взглянуть на Tera-WURFL, это программный пакет на основе PHP и MySQL, который обнаруживает мобильные устройства и их возможности. Вот код Tera-WURFL, который вы бы использовали, чтобы обнаружить мобильное устройство для посещения:

<?php
require_once("TeraWurfl.php");
$wurflObj = new TeraWurfl();
$wurflObj->GetDeviceCapabilitiesFromAgent();
if($wurflObj->capabilities['product_info']['is_wireless_device']){
    // this is a mobile device
}else{
    // this is a desktop device
}
?>    

Еще одна вещь, которую стоит учесть: многие сайты предлагают разные URL-адреса для мобильных устройств. См. http://m.facebook.com/ в качестве примера. С ростом возможностей устройств в наши дни это дает вашим пользователям возможность. Если они находятся на устройстве, которое действительно может красиво обрабатывать весь веб-сайт (используя масштабирование и еще много чего), то они, вероятно, будут довольно раздражены, будучи вынуждены перейти к определенному макету.

Для перенаправления я использовал

$arr = explode('.', $_SERVER['SERVER_NAME'], 2);
$sub=$arr[0];
$need_redirect=false;
if (!isset($_SERVER['HTTP_REFERER'])){
    $need_redirect=true;
}else{
    $domain = parse_url($_SERVER['HTTP_REFERER']);   
    $host = $domain['host'];
    if (!preg_match('/romajidesu\.com/', $host)){
        $need_redirect=true;        
    }    
}
if ($need_redirect && ($sub!='m') && is_mobile() ){
    $old_url=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 
    $new_url='http://'.str_replace('www.', 'm.', $old_url);
    header("Location:".$new_url);die();
}

Для получения более подробной информации о моей реализации, пожалуйста, прочитайте мой блог на http://haibuihoang.blogspot.com/2012/11/how-to-redirect-mobile-users-to-your.html

Традиционно мобильные устройства обнаруживаются путем сравнения заголовка агента пользователя HTTP со списком хорошо известных строк мобильного UA. Вместо этого новый подход пытается обнаружить наличие настольной ОС - все, что не является настольной ОС, должно быть мобильным.

Это приводит к гораздо меньшему количеству ложных срабатываний.

Я написал пост с примером кода на Python здесь: http://notnotmobile.appspot.com/

Вот фрагмент:

import re

# Some mobile browsers which look like desktop browsers.
RE_MOBILE = {
    "iphone" : re.compile("ip(hone|od)", re.I),
    "winmo" : re.compile("windows\s+ce", re.I)}

RE_DESKTOP = {
    "linux" : re.compile(r"linux", re.I),
    "windows" : re.compile(r"windows", re.I),
    "mac" : re.compile(r"os\s+(X|9)", re.I),
    "solaris" : re.compile(r"solaris", re.I),
    "bsd" : re.compile(r"bsd", re.I)}

# Bots that don't contain desktop OSs.
RE_BOT = re.compile(r"(spider|crawl|slurp|bot)")


def is_desktop(user_agent):
  # Anything that looks like a phone isn't a desktop.
  for regex in RE_PHONE.values():
    if regex.search(user_agent) is not None:
      return False

  # Anything that looks like a desktop probably is.
  for regex in RE_DESKTOP.values():
    if regex.search(user_agent) is not None:
      return True

  # Bots get the desktop view.
  if RE_BOT.search(user_agent) is not None:
    return True

  # Anything else is probably a phone!
  return False

def get_user_agent(request):
  # Some browsers put the User-Agent in a HTTP-X header
  if 'HTTP_X_OPERAMINI_PHONE_UA' in request.headers:
    return request.headers['HTTP_X_OPERAMINI_PHONE_UA']
  elif:
    # Skyfire / Bolt / other mobile browsers
    ...
  else:
    return request.headers.get('HTTP_USER_AGENT', '')

def view(request):
  user_agent = get_user_agent(request)
  if is_desktop(user_agent):
    return desktop_response()
  else:
    return mobile_response()

Будет ли пользовательский агент в запросе дать вам достаточно информации, чтобы принять решение?

Здесь есть хороший список пользовательских агентов.

Большинство мобильных сайтов используют исключительно user_agent. База данных о возможностях устройства с открытым исходным кодом поддерживается по адресу: http://wurfl.sourceforge.net/ Используя wurlf и основываясь на user_agent, вы можете определить физический размер экрана, ширину пикселя, длину и многие другие параметры, а также принять решение о рендеринге.,

Что такое мобильное устройство? Слабее процессор? Более низкая пропускная способность? На самом деле у него есть экран, разрешение которого ниже 320x240, а глубина цвета ниже 24.

Вы также должны использовать Javascript. Эта ссылка даст вам представление: http://www.w3schools.com/js/tryit.asp?filename=tryjs_browsermonitor

И эта ссылка научит вас, что к чему: http://www.w3schools.com/htmldom/dom_obj_screen.asp

Для обнаружения на основе User-Agent используйте базу данных WURFL. По крайней мере, он всеобъемлющий и постоянно обновляется.

Если вы нацелены только на высококлассные (ish) телефоны, то вам вообще может не потребоваться их обнаруживать, просто вставьте соответствующие мобильные таблицы стилей.

Если вы хотите адаптировать контент к какому-либо конкретному устройству, например, чтобы изменить размеры изображений в соответствии с шириной устройства, вы также можете использовать DeviceAtlas. На основе идентификатора пользователя запрашивающего устройства он сообщит вам размер экрана, а также поддерживаемые форматы изображений, поддерживаемые типы разметки, максимальный размер страницы и т. Д.

Это не лучший вариант, чтобы определить мобильное устройство, проверив агента пользователя. Вы должны присоединиться к проверке ширины устройства javascript с проверкой пользовательского агента PHP. Но до некоторой степени проверка пользовательского агента приемлема.

Я использую это. Не так хорошо, как WURFL, но легко решает мои проблемы:

function is_mobile_device() {

    $agent=$_SERVER['HTTP_USER_AGENT'];

    if( strpos($agent,"Android") !== FALSE
        || strpos($agent,"IOS") !== FALSE
        || strpos($agent,"iPhone") !== FALSE
        || strpos($agent,"iPad") !== FALSE
        || strpos($agent,"iPod") !== FALSE
        || strpos($agent,"Symbian") !== FALSE
        || strpos($agent,"BlackBerry") !== FALSE
        || strpos($agent,"Opera Mini") !== FALSE
    ) {
        return TRUE;
    }
    return FALSE;

}
Другие вопросы по тегам