Как определить имя устройства в Safari на iOS 13, пока оно не показывает правильный агент пользователя? - PullRequest
3 голосов
/ 20 сентября 2019

После того, как Apple выпустила iOS 13, я понял, что window.navigator.userAgent в Safari на iPad iOS 13 такая же, как на MacOS.Примерно так:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

Как видите, это неправильный пользовательский агент для iPad, и даже нет способа определить, является ли текущее устройство iDevice.


После первоначального исследования я нашел способ обойти это:

Перейдите в Настройки -> Safari -> Запрос рабочего стола сайта -> Все сайты.Вы заметили, что «Все сайты» включены по умолчанию .Если вы отключите его и получите window.navigator.userAgent, теперь отображается правильный пользовательский агент.

, но я не могу попросить каждого пользователя сделать это изменение настроек для каждого устройства.Поэтому я попытался найти другой способ и в итоге написал следующий код, который проверяет, является ли это Safari, macOS и сенсорным экраном, тогда устройство должно быть мобильным устройством Apple , но мне интересно, есть лиЛюбое лучшее предложение / способ определения правильного имени устройства в Safari iOS 13?

detectOs = function(){
   //returns OS name, like "mac"
};

//is Safari on an apple touch-screen device
isSafariInIdevice = function(){
   if (/Safari[\/\s](\d+\.\d+)/.test(windows.navigator.userAgent)) {
      return 'ontouchstart' in window && detectOs() === "mac";      
   }
   return false;
};

1 Ответ

4 голосов
/ 23 сентября 2019

Действительно, хотя изменение параметров в Настройках может быть хорошим решением для пользователя, как разработчик вы не можете на это полагаться.Это так же странно, как просить пользователя не использовать темный режим, потому что ваше приложение не поддерживает его вместо того, чтобы отказаться от него с помощью plist.

На мой взгляд, самый простой способ обнаружить iOS/ iPad OS теперь:

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

Первое условие является старомодным и работает с предыдущими версиями, в то время как второе условие работает для iPad OS 13, которая теперь идентифицирует себя как «Mozilla / 5.0 (Macintosh; IntelMac OS X 10_15) AppleWebKit / 605.1.15 (KHTML, как Gecko) ", который всеми известными мне детекторами платформы не обнаружен (на данный момент) ни в качестве мобильного, ни настольного компьютера.

Так что теперь iPad OS вызываетMacintosh, но настоящие Mac не имеют поддержки multi-touch, это решение идеально подходит для обнаружения устройств с ОС iPad, которые являются единственными мультитач-устройствами Macintosh.

...