Как определить режим запроса рабочего стола в iOS Mobile Safari и Chrome?

Я хотел бы отправлять версию моего веб-сайта для iPad, когда пользователи используют «запрос настольного сайта» мобильного сафари iOS или «запрос настольной версии» iOS Chrome. Кажется, что в этом режиме отличается только пользовательский агент, и его невозможно обнаружить. Любые идеи?

У меня есть три версии сайта: компьютер / планшет / смартфон. Версия для планшетов - это статическая версия настольной версии, которая очень динамична и сильно использует JavaScript (эффекты параллакса).


person apptaro    schedule 15.05.2015    source источник


Ответы (3)


Я видел, как несколько человек использовали файлы cookie / sessionStorage для обнаружения изменяющегося пользовательского агента, например http://leavesofcode.net/2013/07/08/responsive-design-with-switch-to-desktop-site-option/ и https://gist.github.com/dtipson/7401026

Однако я обнаружил, что вы можете пропустить все это, сделав перекрестную ссылку navigator.platform на navigator.userAgent. Это специально для iOS, так как я слышал, что Chrome «запрос на рабочий стол» также автоматически обновляет область просмотра, поэтому эта проверка может не требоваться для него.

var iOSAgent = window.navigator.userAgent.match(/iPhone|iPod|iPad/);
var iOSPlatform = window.navigator.platform && window.navigator.platform.match(/iPhone|iPod|iPad/);
var iOSRequestDesktop = (!iOSAgent && iOSPlatform);
person zeroimpl    schedule 27.09.2018
comment
Похоже, это больше не будет работать: platform = MacIntel для режима рабочего стола (проверено на iPadOS 13 Beta 2). Также в iPadOS 13 похоже, что для режима рабочего стола по умолчанию установлено значение true (проверьте настройки Safari). Мой текущий обходной путь состоит в том, чтобы предположить, что поддержка сенсорного ввода есть только на iOS / iPadOS, а не на Mac, то есть «ontouchstart» в document.documentElement и Safari означает режим рабочего стола - однако это очень грязный хак, поскольку он сломается, если Apple выйдет с MacBook с трогать. Я тоже не знаю, как поступают с ручками. - person robocat; 03.07.2019
comment
Пожалуйста, посмотрите этот ответ, который работает очень хорошо; он использует тот же принцип, но ищет разные значения и полагается на обнаружение касания ..: - person Peter; 25.11.2019

Еще один грязный прием - использовать platform.maxTouchPoints в iOS 13+.. Это поле все еще присутствует даже после запроса настольной версии, но в реальном настольном Safari это поле отсутствует.

person Дмитрий Ляпунов    schedule 09.10.2019

См. Ответ на этот вопрос: https://stackoverflow.com/a/58064481/1237536

работает безупречно (по крайней мере, пока) ..

По сути, когда iPad находится в «режиме рабочего стола», они рекламируют себя как MacIntel, но ни один Mac в настоящее время не имеет сенсорного экрана, поэтому вы ищите MacIntel с включенным сенсорным экраном:

let isIOS = /iPad|iPhone|iPod/.test(navigator.platform) ||
(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)

но вам обязательно стоит взглянуть на исходный ответ - я не пытаюсь поверить в это: https://stackoverflow.com/a/58064481/1237536

person Peter    schedule 25.11.2019