Расскажите iPadOS от macOS в Интернете
Пользовательский агент Safari на бета-версии iPadOS на данный момент точно такой же, как Safari на macOS. Есть ли другой способ отличить iPad от Mac?
iPad running iOS
Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1
iPadOS, developer beta 1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
iPadOS, beta 2, simulator
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
iPadOS, beta 3, (simulator)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
iPadOS, developer beta 3
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
iPadOS, developer beta 4
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
macOS Catalina
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
macOS (older version)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Safari/605.1.15
5 ответов
Я использую эту тестовую клиентскую часть:
if (navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2) {
...must be iPad OS...
Поскольку у Mac нет официального сенсорного экрана, это кажется довольно безопасным. Фактическое значение maxTouchPoints на iPad - 5, кстати.
Я бы вообще не рекомендовал это, и я не очень много тестировал, но одним из способов могло бы быть обнаружение существования TouchEvent
на стороне клиента и сопоставьте его с состоянием пользовательского агента для учета более старых версий iPad для iOS:s. YMMV. Вероятно, не очень безопасное будущее.
function isIpad() {
const ua = window.navigator.userAgent;
if (ua.indexOf('iPad') > -1) {
return true;
}
if (ua.indexOf('Macintosh') > -1) {
var isTouchEvent = false;
try {
document.createEvent("TouchEvent");
isTouchEvent = true;
} catch (e) {
isTouchEvent = false;
}
return isTouchEvent ? true : false;
}
return false;
}
Я использую это нормально:
const ua = window.navigator.userAgent.toLowerCase();
const isiPad = ua.indexOf('ipad') > -1 || ua.indexOf('macintosh') > -1 && 'ontouchend' in document;
Как упомянул @Jonny, вы можете попытаться обнаружить события касания, это решение, которое я использую в настоящее время
function isTouchDevice() {
if (typeof window === 'undefined') return false
const prefixes = ' -webkit- -moz- -o- -ms- '.split(' ')
function mq(query) {
return typeof window !== 'undefined' && window.matchMedia(query).matches
}
if ('ontouchstart' in window || (window?.DocumentTouch && document instanceof DocumentTouch)) return true
const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('') // include the 'heartz' - https://git.io/vznFH
return mq(query)
}
интересный пост об обнаружении событий касания
и еще одно примечание: Firefox на Ipad использует тот же пользовательский агент safari: /
Если вы используете ua-parser-js для анализа User-Agent, вы увидите, что iPad имеет «Mobile Safari» в качестве файла , а на Mac — «Safari».
Если пользователь вошел в систему Chrome, будетiPad
для iPad.
Единственная проблема, кажется, в Firefox... в котором есть "Safari"browser.name
и «Макинтош» какparsedUA.device.model
для iPad...
(Я пытаюсь полагаться исключительно на User-Agent, потому что я извлекаю устройства пользователя, вошедшие в систему, из серверной части, и у меня нет другой информации об устройстве пользователя)