Ответ 1
Вам нужно проверить несколько заголовков, которые отправляет клиент, например USER_AGENT и HTTP_ACCEPT. Ознакомьтесь с этой статьей для всестороннего обнаружения script для мобильных пользовательских агентов в PHP.
Я пишу веб-сайт с PHP. Поскольку для доступа в Интернет кому-либо из них необходимо будет получить доступ, я должен создать мобильную версию. Как лучше всего проверить, мобильное устройство? Я не хочу иметь оператор switch с 50 устройствами в конце, так как я не только хочу поддерживать iPhone.
Есть ли класс PHP, который я мог бы использовать?
Вам нужно проверить несколько заголовков, которые отправляет клиент, например USER_AGENT и HTTP_ACCEPT. Ознакомьтесь с этой статьей для всестороннего обнаружения script для мобильных пользовательских агентов в 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-пользователя 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 используйте базу данных WURFL. По крайней мере, это всеобъемлющее и постоянно обновляемое.
Если вы нацеливаетесь только на высококачественные (ish) телефоны, вам может не понадобиться их вообще обнаружить, просто встроить соответствующие таблицы стилей для мобильных устройств.
Если вы хотите настроить контент на какое-либо конкретное устройство, например. для изменения размеров изображений в качестве ширины устройства, вы также можете использовать DeviceAtlas. На основе useragent запрашивающего устройства он укажет размер экрана, поддерживаемые форматы изображений, поддерживаемые типы разметки, максимальный размер страницы и т.д.
Большинство мобильных сайтов используют исключительно 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
Это не лучший вариант для решения мобильного устройства путем проверки агента пользователя. Вы должны присоединиться к проверке ширины устройства 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;
}