Как определить, является ли это мобильным устройством с 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;
}