Общепринято, что на устройствах 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 в JavaScript:
IS_IPHONE = navigator.userAgent.match(/iPhone/i) != null) || (navigator.userAgent.match(/iPod/i) != null);
Если бы вы использовали этот подход для обнаружения iPhone, в конечном итоге IS_IPHONE был бы истинным, еслиПользователь заходит с Facebook на iPad.Это может создать какое-то странное поведение!
Правильный способ идентифицировать iPhone в 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), СДЕЛАЙТЕ ЭТО.