Несмотря на то, что принятое решение является правильным для iPhone, оно неверно объявит isiPhone
и isiPad
для пользователей, которые посещают ваш сайт на своем iPad из приложения Facebook.
Общепринято, что на устройствах iOS есть пользовательский агент для Safari и пользовательский агент для UIWebView.Это предположение неверно, поскольку приложения для iOS могут настраивать свой пользовательский агент.Основным нарушителем здесь является Facebook.
Сравните эти строки пользовательских агентов с устройств iOS:
# iOS Safari
iPad: Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3
iPhone: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
# UIWebView
iPad: Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/98176
iPhone: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Mobile/8B117
# Facebook UIWebView
iPad: Mozilla/5.0 (iPad; U; CPU iPhone OS 5_1_1 like Mac OS X; en_US) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.1.1;FBBV/4110.0;FBDV/iPad2,1;FBMD/iPad;FBSN/iPhone OS;FBSV/5.1.1;FBSS/1; FBCR/;FBID/tablet;FBLC/en_US;FBSF/1.0]
iPhone: Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; ru_RU) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.1;FBBV/4100.0;FBDV/iPhone3,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; tablet;FBLC/en_US]
Обратите внимание, что на iPad строка пользовательского агента Facebook UIWebView включает в себя «iPhone».
Старый способ идентифицировать iPhone / iPad в JavaScript:
IS_IPAD = navigator.userAgent.match(/iPad/i) != null;
IS_IPHONE = navigator.userAgent.match(/iPhone/i) != null) || (navigator.userAgent.match(/iPod/i) != null);
Если бы вы использовали этот подход для обнаружения iPhone и iPad, вы бы получили IS_IPHONEи IS_IPAD оба имеют значение true, если пользователь выходит из Facebook на iPad.Это может создать какое-то странное поведение!
Правильный способ идентифицировать iPhone / iPad в JavaScript:
IS_IPAD = navigator.userAgent.match(/iPad/i) != null;
IS_IPHONE = (navigator.userAgent.match(/iPhone/i) != null) || (navigator.userAgent.match(/iPod/i) != null);
if (IS_IPAD) {
IS_IPHONE = false;
}
Мы объявляем IS_IPHONE ложным на iPad для покрытиястранный пользовательский агент Facebook UIWebView для iPad.Это один из примеров того, как сниффинг агента пользователя ненадежен.Чем больше приложений для iOS настраивают свой пользовательский агент, тем больше проблем будет с прослушиванием пользовательского агента.Если вы можете избежать прослушивания пользовательского агента (подсказка: CSS Media Queries), ДЕЛАЙТЕ ЭТО.