Cihazın iOS olup olmadığını algılama


408

Modernizr ile algılamayı nasıl yapabileceğinize benzer şekilde, bir tarayıcının iOS'ta çalışıp çalışmadığını tespit etmenin mümkün olup olmadığını merak ediyorum (bu özellik algılama yerine cihaz algılama olsa da).

Normalde bunun yerine özellik algılamayı tercih ederim, ancak bu soruya göre videoları işlemeleri nedeniyle bir cihazın iOS olup olmadığını öğrenmem gerekiyor YouTube API'sı iPad / iPhone / Flash olmayan cihazlarla çalışmıyor


Bkz. [İOS 5 kullanıcı aracısı dizesi nedir?] [1] (yineleniyor?). [1]: stackoverflow.com/questions/7825873/…
dejuknow

1
Bu istemci tarafı mı yoksa sunucu tarafı mı algılama?
Douglas Greenshields

Hey @DouglasGreenshields, istemci tarafı
SparrwHawk

1
Ayrıca, bir kopya değil, nasıl yapılacağını soruyorum. Daha önce hiç kullanıcı-ajan koklama kullanmamıştım.
SparrwHawk

Yanıtlar:


821

İOS'u algılama

Ben kullanıcı Ajan koklama hayranı değilim, ama nasıl yapacağını şöyle:

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

Başka bir yol da güvenmektir navigator.platform:

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

iOSya olacak trueyafalse

Neden MSStream değil

Microsoft, Gmail'i bir şekilde kandırmaya çalışmak için IE11'e iPhone kelimesini enjekte etti userAgent. Bu nedenle onu hariç tutmamız gerekiyor. Burada ve burada daha fazla bilgi .

IE11'in güncellenmiş sürümü userAgent(Windows Phone 8.1 için Internet Explorer Güncellemesi):

Mozilla / 5.0 (Mobil; Windows Phone 8.1; Android 4.0; ARM; Trident / 7.0; Dokunmatik; rv: 11.0; IEMobile / 11.0; NOKIA; Lumia 930) gibi iPhone OS 7_0_3 Mac OS X AppleWebKit / 537 (KHTML, Gecko gibi) Mobil Safari / 537


Normal İfadeler kullanmadan kolayca daha fazla cihaz ekleyin:

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()ya olacak trueyafalse

Not: Her ikisi de navigator.userAgentve navigator.platformkullanıcı veya bir tarayıcı uzantısı tarafından taklit edilebilir.


İOS sürümünü algılama

İOS sürümünü tespit etmenin en yaygın yolu , User Agent dizesinden ayrıştırmaktır . Ancak özellik algılama çıkarımları da vardır * ;

Biz bir gerçeği biliyorum history APItanıtıldı iOS4 - matchMedia APIin iOS5 - webAudio APIin iOS6 - WebSpeech APIin -iOS7 ve benzeri ..

Not: Aşağıdaki kod güvenilir değildir ve bu HTML5 özelliklerinden herhangi biri daha yeni bir iOS sürümünde kullanımdan kaldırılırsa bozulur. Uyarıldın!

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';
}

2
Teşekkürler Pierre - bu kod daha basit görünüyor, ben sadece tüm ayrı iDevices yazmak zorunda değil sadece 'iOS' belirtebilirsiniz merak ediyorum .... if ((navigator.userAgent.match (/ iPhone / i)) | | (navigator.userAgent.match (/ iPod / i)) || (navigator.userAgent.match (/ iPad / i))) {// Bir şeyler yapın}
SparrwHawk

9
İkinci snippet'te yaptığınız şey özellik saptaması değil, özellik çıkarımdır. Özellik algılama, gerçekten kullanacağınız özellikleri test ederken, yaptığınız şey, işletim sisteminin belirli bir sürümünde tanıtıldığı ve işletim sistemi sürümünden onlardan çıktığını bildiğiniz özellikleri test etmektir. Bu kırılgandır çünkü iOS'un gelecekteki sürümleri bu özellikleri kaldırabilir.
Tim Down

23
var iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
Çekinizi yazmanın

5
Sadece bir not - navigator.platform dizisi, iPad Simulator'da çalışmaz çünkü platform dizesinde "iPad Simulator" ifadesinin tamamını içerir.
Kevin Newman

9
İOS 13'ten iPad'in kullanıcı aracısı "Mac OS" olarak değiştirildi, örneğin: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15bu cevabın güncellenmesi gerekiyor
zvi

38

İOS 13'ten sonra, iPad'in eski yöntemlerle iOS cihazları olarak algılanmayacağı için (böyle varsayılan olarak etkin olan yeni "masaüstü" seçenekleri nedeniyle) böyle iOS cihazlarını tespit etmelisiniz:

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

Masaüstü modunu devre dışı bırakan iOS <13 veya iPhone veya iPad için ilk koşul, varsayılan yapılandırmada iPadOS 13 için ikinci koşul, çünkü kendini Macintosh Intel gibi konumlandırıyor, ancak aslında çoklu dokunuşlu tek Macintosh.

Gerçek bir çözümden ziyade bir hack, ama benim için güvenilir bir şekilde çalış

PS Daha önce de söylendiği gibi, muhtemelen IE kontrolü eklemelisiniz

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

Neden navigator.userAgentbu kontrol için kullanılmıyor /iPad|iPhone|iPod/.test(navigator.platform)? Görünüşe göre navigator.platformiPhone iOS için her zaman 'MacIntel' döndürüyor <= 12
Charis Theo

@CharisTheo iPad iOS'ta olmadığı için iOS'takiAgent> = 13
Kzrbill

ama zaten ikinci kontrolde iPad iOS> = 13'ü kontrol ediyor musunuz yoksa bir şey mi kaçırıyorum?
Charis Theo

navigator.maxTouchPointsiOS'ta desteklenmediğinden, kontrol sizin için hiçbir şey yapmaz.
PaulC

@PaulC, iOS 12 ve önceki sürümler için maxTouchPoints öğesinin tanımsız olduğu konusunda doğrusınız, ancak maxTouchPoints iOS 13'te desteklendiğinden kikiwora doğru yolda.
Bob Arlof

14

Bu değişken setleri _iOSDeviceiçin gerçek veya FALSE

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

3
nedir !! yapmak?
patrick

4
@astronought çift olumsuzlama bir boole için kullanılır
Vitim.us

2
@astronought bang bang, booleansın: D
Qback

1
Kullanılması /iPhone|iPod|iPad/.test(navigator.platform)Eğer önleyebilirsiniz!!
lionello

10

Modernizr kullanıyorsanız , bunun için özel bir test ekleyebilirsiniz.

Hangi algılama modunu kullanmaya karar verdiğiniz önemli değildir (userAgent, navigator.vendor veya navigator.platform), daha sonra daha kolay kullanmak için her zaman kapatabilirsiniz.

//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');
}

2
Dikkatli olun, Modernizr eklenen testin adını otomatik olarak küçük harfe çevirir. (örneğin, Modernizr.isiOS hiçbir zaman doğru olmayacaktır). Bence lib kötü davranışı ...
Cétia

3
Sadece küçücük uyarı: kolaylaştırabilirsiniz return x ? true : falseiçin return Boolean(x)ya da sadecereturn !!x
Tibalt


6

Basitleştirilmiş, genişletilmesi kolay bir versiyon.

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

1
Ayrıca iOS Simulator için çalışmalarına bu isterseniz kullanabilirsiniz: navigator.platform.replace(' Simulator', '').
Koraktor

Ama işe yaramıyor, neden['str'].indexOf('string') == -1
tibalt

navigator.platform , simülatör çalışmadığı sürece tam olarak 'iPad', 'iPhone' veya 'iPod' olacaktır.
Kory Nunn

4

Muhtemelen iOS 13 çalıştıran iPad'lerin navigator.platformayarlanacağına cevap vermeye değer MacIntel, bu da iPadOS cihazlarını tespit etmek için başka bir yol bulmanız gerektiği anlamına gelir.


3

Bunu birkaç yıl önce yazdım ama hala işe yaradığına inanıyorum:

if(navigator.vendor != null && navigator.vendor.match(/Apple Computer, Inc./) && navigator.userAgent.match(/iPhone/i) || (navigator.userAgent.match(/iPod/i))) 

    {

        alert("Ipod or Iphone");

    }

else if (navigator.vendor != null && navigator.vendor.match(/Apple Computer, Inc./) && navigator.userAgent.match(/iPad/i))  

    {

        alert("Ipad");

    }

else if (navigator.vendor != null && navigator.vendor.match(/Apple Computer, Inc./) && navigator.userAgent.indexOf('Safari') != -1)

    {

        alert("Safari");

    }

else if (navigator.vendor == null || navigator.vendor != null)

    {

        alert("Not Apple Based Browser");

    }

2

İOS cihazlardaki kullanıcı aracıları, içinde iPhone veya iPad diyor. Ben sadece bu anahtar kelimelere göre filtre.


4
Dikkate alınması gereken iPod Touch'lar da var.
Douglas Greenshields

@DouglasGreenshields Doğru. Bunu unuttum ama kimliğini kullanıcı aracısına da ilettiğine inanıyorum.
Bryan Naegele

İPad safari kullanıcı aracısı artık iPadOS 13'ten "iPad" içermeyecek
Jonny

2

Modernizr testleri eklerken mümkün olan her yerde bir cihaz veya işletim sistemi yerine bir özellik için bir test eklemelisiniz. İPhone için tüm testleri on test eklemekle ilgili yanlış bir şey yoktur. Bazı şeyler özellik algılanamaz.

    Modernizr.addTest('inpagevideo', function ()
    {
        return navigator.userAgent.match(/(iPhone|iPod)/g) ? false : true;
    });

Örneğin, iPhone'da (iPad'de değil) video bir web sayfasında yerinde oynatılamaz, tam ekran açılır. Bu yüzden 'no-inpage-video' testi oluşturdum

(Modernizr bir sınıf ekler Daha sonra css kullanabilirsiniz .no-inpagevideoiçin <html>sınama başarısız olursa etiketi)

.no-inpagevideo video.product-video 
{
     display: none;
}

Bu, iPhone'daki videoyu gizleyecektir (bu durumda yaptığım şey, videoyu oynatmak için bir tıklama ile alternatif bir görüntü gösteriyor - sadece varsayılan video oynatıcı ve oynat düğmesinin gösterilmesini istemiyorum).


iOS10 şimdilik verir playsinlinekullanabilirsiniz böylece 'playsInline' in document.createElement('video');bir test artık github.com/Modernizr/Modernizr/issues/2077
Simon_Weaver

2

Vay canına, burada bir sürü uzunca zor kod var. Basit olsun lütfen!

Bu IMHO hızlı, tasarruf ve iyi çalışıyor:

 iOS = /^iP/.test(navigator.platform);

 // or, more future-proof (in theory, probably not in practice):

 iOS = /^iP(hone|[ao]d)/.test(navigator.platform);

 // or, if you prefer readability:

 iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);
  • Regexp önce platform dizesinin ^ s katlama konumunu kontrol eder ve "iP" yoksa durur (yine de sonuna kadar uzun UA dizesini aramaktan daha hızlıdır)
  • UA kontrolünden daha güvenlidir (navigator.platform'un daha az sahte olduğunu varsayarsak)
  • İPhone / iPad Simülatörünü algılar


GÜNCELLEME: Bu, masaüstü modunda iPad'i (ve dolayısıyla varsayılan iPadOS 13'ü) kapsamaz.
Bu benim kullanımım için iyi, eğer senin için değilse, Justin ve kikiwora'nın cevaplarına bakın.


iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);daha ziyade iOS = /^(iPhone|iPad|iPod)/.test(navigator.userAgent || navigator.vendor || navigator.platform); benim durumumda bir düşme önlemi olarak yapacağım navigator.platform işe yaramadı, ancak daha sonra iyi çalıştı gibi yapmak
Coderboi

navigator.platformişe yaramadı mı? Gerçekten iOS'ta mısınız? Jeka.info/test/navigator.html ile kontrol edin . userAgentyanlış satıcılar verir, çünkü bazı satıcılar Apple cihazlarını taklit etmek için her ne nedenle olursa olsun sahte yaparlar. vendorSadece döner ya Google Inc., Apple Computer, Inc.ya (Firefox) hiçbir şey.
jj

1

Daha işlevsel bir yaklaşım kullanarak ilk cevabı biraz güncelleyin.

    const isIOS = [
      'iPad Simulator',
      'iPhone Simulator',
      'iPod Simulator',
      'iPad',
      'iPhone',
      'iPod',
    ].indexOf(navigator.platform) !== -1;

Brave / Chrome dev araçları mobil simülatöründe çalışmaz. Ben olsunMacIntel
sdfsdf

1

Buradaki önceki yanıtların hiçbiri, iOS 13 dahil olmak üzere iOS'un tüm sürümlerindeki tüm büyük tarayıcılar için çalışmıyor. İşte tüm iOS sürümleri için Safari, Chrome ve Firefox için çalışan bir çözüm:

var isIOS = (function () {
    var iosQuirkPresent = function () {
        var audio = new Audio();

        audio.volume = 0.5;
        return audio.volume === 1;   // volume cannot be changed from "1" on iOS 12 and below
    };

    var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
    var isAppleDevice = navigator.userAgent.includes('Macintosh');
    var isTouchScreen = navigator.maxTouchPoints >= 1;   // true for iOS 13 (and hopefully beyond)

    return isIOS || (isAppleDevice && (isTouchScreen || iosQuirkPresent()));
})();

Bu kod snippet'inin özlüğe veya performansa değil, okunabilirliğe öncelikli olarak yazıldığını unutmayın.

Açıklama:

  • Kullanıcı aracısı "iPod | iPhone | iPad" 'den herhangi birini içeriyorsa, cihaz açıkça iOS'tur. Aksi takdirde, devam edin ...

  • "Macintosh" içermeyen başka herhangi bir kullanıcı aracısı bir Apple cihazı değildir ve bu nedenle iOS olamaz. Aksi takdirde, bir Apple cihazıdır, bu yüzden devam edin ...

  • Eğer maxTouchPointsbir değere sahiptir 1ya da daha büyük ardından Apple cihaz dokunmatik ekrana sahip ve (söz için kikiwora şeref dokunmatik ekranlar ile hiçbir Mac'ler olmadığından bu nedenle iOS olmalıdır maxTouchPoints). Not maxTouchPointsolduğunu undefinedbiz bu senaryo için farklı bir çözüm gerek böylece, iOS 12 ve altında ...

  • iOS 12 ve önceki sürümlerde Mac OS'de olmayan bir tuhaflık var. Tuhaflık, volumebir Audioöğenin özelliğinin dışında herhangi bir değere başarıyla ayarlanamamasıdır 1. Bunun nedeni, Apple'ın AudioiOS aygıtları için öğe üzerinde ses değişikliklerine izin vermemesi , ancak Mac OS için olmasıdır. Bu tuhaflık, bir iOS cihazını bir Mac OS cihazından ayırmak için son geri dönüş yöntemi olarak kullanılabilir.


0

Ayrıca kullanabilirsiniz includes

  const isApple = ['iPhone', 'iPad', 'iPod'].includes(navigator.platform)

-1

Benim durumumda, Ipad'de kullanıcı aracısı Mac OS ile aynı olduğu için kullanıcı aracısı yeterince iyi değildi, bu nedenle kötü bir numara yapmak zorunda kaldım:

var mql = window.matchMedia("(orientation: landscape)");

/**
 * If we are in landscape but the height is bigger than width
 */
if(mql.matches && window.screen.height > window.screen.width) {
    // IOS
} else {
    // Mac OS
}

sadece iOS tespit, mobil algılama değil soruyu okuyun
Cybersupernova

-2

İOS sürümünü algılamak için kullanıcı aracısını aşağıdaki gibi bir Javascript koduyla yapılandırmak gerekir:

 var res = navigator.userAgent.match(/; CPU.*OS (\d_\d)/);
    if(res) {
        var strVer = res[res.length-1];
        strVer = strVer.replace("_", ".");
        version = strVer * 1;
    }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.