[javascript] 기기가 iOS인지 감지

Modernizr로 기능을 감지하는 방법과 비슷하게 브라우저가 iOS에서 실행 중인지 감지 할 수 있는지 궁금합니다 (기능 감지가 아닌 장치 감지 임에도 불구하고).

일반적으로 대신 기능 감지를 선호하지만이 질문에 따라 비디오를 처리하는 방식으로 인해 장치가 iOS인지 여부를 찾아야합니다. YouTube API는 iPad / iPhone / 비 플래시 장치에서 작동하지 않습니다.



답변

iOS 감지

나는 사용자 에이전트 스니핑 팬이 아니지만 다음과 같이하십시오.

var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;

다른 방법은 다음에 의존합니다 navigator.platform.

var iOS = navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);

iOS것 중 하나 true또는false

왜 MSStream이 아닌가

Microsoft 는 IE11에 iPhone 이라는 단어를 삽입하여 userAgent어떻게 든 Gmail을 시도했습니다. 따라서 제외해야합니다. 여기여기 에 대한 자세한 정보 .

아래는 IE11의 업데이트입니다 userAgent(Windows Phone 8.1 용 Internet Explorer 업데이트).

iPhone OS와 같은 Mozilla / 5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident / 7.0; Touch; rv : 11.0; IEMobile / 11.0; NOKIA; Lumia 930) 7_0_3 Mac OS X AppleWebKit / 537 (Gecko와 같은 KHTML) 모바일 사파리 / 537


정규식을 사용하지 않고도 더 많은 장치를 쉽게 추가 할 수 있습니다.

function iOS() {

  var iDevices = [
    'iPad Simulator',
    'iPhone Simulator',
    'iPod Simulator',
    'iPad',
    'iPhone',
    'iPod'
  ];

  if (navigator.platform) {
    while (iDevices.length) {
      if (navigator.platform === iDevices.pop()){ return true; }
    }
  }

  return false;
}

iOS()것 중 하나 true또는false

주 :navigator.userAgentnavigator.platform사용자 또는 브라우저 확장에 의해 위조 할 수 있습니다.


iOS 버전 감지

iOS 버전을 감지하는 가장 일반적인 방법은 User Agent 문자열에서 파싱하는 것입니다 . 그러나 또한이 기능 감지 추론 * ;

우리는 사실을 알고 history API에 도입 된 iOS4matchMedia APIiOS5를webAudio APIiOS6의WebSpeech APIiOS7에 등등 ..

참고 : 다음 코드는 신뢰할 수 없으며 최신 HTML 버전에서 이러한 HTML5 기능이 더 이상 사용되지 않으면 중단됩니다. 경고를 받았습니다!

function iOSversion() {

  if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
    if (window.indexedDB) { return 'iOS 8 and up'; }
    if (window.SpeechSynthesisUtterance) { return 'iOS 7'; }
    if (window.webkitAudioContext) { return 'iOS 6'; }
    if (window.matchMedia) { return 'iOS 5'; }
    if (window.history && 'pushState' in window.history) { return 'iOS 4'; }
    return 'iOS 3 or earlier';
  }

  return 'Not an iOS device';
}


답변

iOS 13 이후에는 다음과 같은 iOS 장치를 감지해야합니다. iPad는 오래된 방법으로 iOS 장치로 감지되지 않기 때문입니다 (기본적으로 활성화 된 새로운 “데스크톱”옵션으로 인해).

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

데스크탑 모드가 비활성화 된 iOS <13 또는 iPhone 또는 iPad의 첫 번째 조건, 기본 구성의 iPadOS 13의 두 번째 조건은 Macintosh Intel처럼 위치하기 때문에 실제로는 멀티 터치가있는 유일한 Macintosh입니다.

실제 솔루션보다 해킹이 아니라 안정적으로 작동합니다.

PS 앞에서 언급했듯이 IE 점검을 추가해야 할 것입니다.

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


답변

변수 _iOSDevicetrue 또는 false 로 설정합니다.

_iOSDevice = !!navigator.platform.match(/iPhone|iPod|iPad/);


답변

당신이 사용하는 경우 Modernizr 하는 경우 사용자 정의 테스트를 추가 할 수 있습니다.

어떤 탐지 모드를 사용하기로 결정했는지 (userAgent, navigator.vendor 또는 navigator.platform)는 중요하지 않으므로 나중에 쉽게 사용할 수 있도록 항상 마무리 할 수 ​​있습니다.

//Add Modernizr test
Modernizr.addTest('isios', function() {
    return navigator.userAgent.match(/(iPad|iPhone|iPod)/g);
});

//usage
if (Modernizr.isios) {
    //this adds ios class to body
    Modernizr.prefixed('ios');
} else {
    //this adds notios class to body
    Modernizr.prefixed('notios');
}


답변

이 사용자 정의 Modernizr 테스트가 있습니다 : https://gist.github.com/855078


답변

간단하고 확장하기 쉬운 버전.

var iOS = ['iPad', 'iPhone', 'iPod'].indexOf(navigator.platform) >= 0;


답변

iOS 13을 실행하는 iPad가 (으)로 navigator.platform설정되어 MacIntel있으면 iPadOS 장치를 감지하는 다른 방법을 찾아야합니다.