Обнаружение устройств всегда было обязательным для создания многофункциональных совместимых и адаптируемых веб-интерфейсов.
До:
Некоторые из них легко обнаружить: например, iPhoneX имеет window.devicePixelRatio, равное 3,0. Однако некоторые из них действительно сложны, потому что они одного размера.
Возьмем следующий пример: iPhone 6–7 и 8: 375 x 667 пикселей.
Один из способов отличить их - использовать трюк WebGL для чтения имени графического процессора, и, поскольку они разные, вы можете сказать:
Если имя графического процессора: Apple A9 = ›SE / 6S
Если имя графического процессора: Apple A10 = ›7
Если имя графического процессора: Apple A11 = ›8
и т.д..
Ссылку можно найти здесь: https://developer.mozilla.org/en-US/docs/Web/API/WEBGL_debug_renderer_info
В настоящее время:
Недавно, начиная с iOS 12.2, Apple решила скрыть эту информацию и вернуть общий Apple GPU (https://51degrees.com/blog/apple-ios-122-degrades-device- точность обнаружения )
Я безуспешно пытался найти способ различить их в течение нескольких часов, прежде чем написать тест WebGL GLSL следующим образом:
1) Запишите небольшое значение (от 0 до 1) с большим количеством десятичных знаков в переменную типа float, например:
0.31622776601683794
2) Закодируйте его в пиксель RGBA
3) Запишите это в текстуру RGBA
4) Считайте это значение с помощью readPixels
Вот где происходит волшебство: графические процессоры iPhone 7 и iPhone 8 не поддерживают одинаковую точность вычислений с плавающей запятой и поэтому возвращают разные результаты!
Пример :
Https://github.com/Samsy/appleGPUDetection/blob/master/index.js
В этом примере используется THREE.js для быстрой демонстрации, но его можно преобразовать в более легкий тест WebGL.
ОБНОВЛЕНИЕ:
Это явно нелепый способ обнаружения оборудования. Это не должно быть так сложно.
Большое спасибо