पता लगाएँ कि क्या डिवाइस आईओएस है


408

मुझे आश्चर्य हो रहा है कि क्या यह पता लगाना संभव है कि क्या iOS पर कोई ब्राउज़र चल रहा है, इसी तरह आप Modernizr के साथ कैसे पता लगा सकते हैं (हालांकि यह फीचर का पता लगाने के बजाय जाहिर तौर पर डिवाइस डिटेक्शन है)।

आम तौर पर मैं इसके बजाय सुविधा का पता लगाने का पक्ष लेता हूं, लेकिन मुझे यह पता लगाना होगा कि क्या कोई डिवाइस iOS है क्योंकि वे इस प्रश्न के अनुसार वीडियो संभालते हैं YouTube API iPad / iPhone / गैर-फ्लैश डिवाइस के साथ काम नहीं कर रहा है


देखें [आईओएस 5 उपयोगकर्ता-एजेंट स्ट्रिंग क्या है?] [1] (डुप्लिकेट?)। [१]: stackoverflow.com/questions/7825873/…

1
क्या यह क्लाइंट-साइड या सर्वर-साइड डिटेक्शन है?
डगलस ग्रीनशील्ड्स


1
इसके अलावा, डुप्लिकेट नहीं, मैं पूछ रहा हूं कि यह कैसे करना है। मैंने पहले कभी भी उपयोगकर्ता-एजेंट को सूँघने का प्रयोग नहीं किया है।
२१:१२ बजे

जवाबों:


821

आईओएस का पता लगाना

मैं उपयोगकर्ता एजेंट सूँघने का प्रशंसक नहीं हूं, लेकिन यहां बताया गया है कि आप इसे कैसे करेंगे:

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

एक और तरीका है navigator.platform:

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

iOStrueया तो होगाfalse

MSStream क्यों नहीं

Microsoft ने IE11 में किसी भी तरह Gmail को आज़माने और मूर्ख बनाने के लिए iPhone शब्द को इंजेक्ट किया userAgent। इसलिए हमें इसे बाहर करने की जरूरत है। इसके बारे में और अधिक जानकारी यहाँ और यहाँ

नीचे IE11 का अद्यतन userAgent(विंडोज फोन 8.1 अपडेट के लिए इंटरनेट एक्सप्लोरर) है:

मोज़िला / 5.0 (मोबाइल; विंडोज़ फोन 8.1; एंड्रॉइड 4.0; एआरएम; ट्राइडेंट / 7.0; टच; आरवी: 11.0; IEMobile / 11.0; नोकिया; लूमिया 930) जैसे आईफोन ओएस 7_0_3 मैक ओएस एक्स ऐप्पल रीबिट / 537 (केएचसी, गेको की तरह) मोबाइल सफारी / 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.userAgentऔर navigator.platformउपयोगकर्ता किसी ब्राउज़र विस्तार के द्वारा नाटक किया जा सकता है।


आईओएस संस्करण का पता लगाना

IOS संस्करण का पता लगाने का सबसे आम तरीका उपयोगकर्ता एजेंट स्ट्रिंग से इसे पार्स करके है । लेकिन इसमें फीचर डिटेक्शन इंट्रेंस * भी है ;

हम एक तथ्य यह है कि के लिए पता है history APIमें पेश किया गया था iOS4 - matchMedia APIमें iOS5 - webAudio APIमें iOS6 - WebSpeech APIमें iOS7 और इतने पर ..

नोट: निम्न कोड विश्वसनीय नहीं है और यह टूट जाएगा यदि इनमें से कोई भी HTML5 सुविधाएँ नए iOS संस्करण में हटा दी जाती हैं। आपको चेतावनी दी गई है!

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
धन्यवाद पियरे - यह कोड हालांकि सरल लगता है, मुझे आश्चर्य है कि क्या मैं सभी अलग-अलग iDevices टाइप करने के बजाय 'iOS' को निर्दिष्ट कर सकता हूं .... यदि ((navigator.userAgent.match (/ iPhone / i)) | | (navigator.userAgent.match (/ iPod / i)) || (navigator.userAgent.match (/ iPad / i))) {// कुछ करो}
SparrwHawk

9
दूसरे स्निपेट में आप जो कर रहे हैं वह फीचर इंट्रेंस है, फीचर डिटेक्शन नहीं। फ़ीचर डिटेक्शन उन विशेषताओं का परीक्षण कर रहा है, जिनका आप वास्तव में उपयोग करने जा रहे हैं, जबकि आप जो परीक्षण कर रहे हैं, वह उन विशेषताओं का परीक्षण कर रहा है, जिन्हें आप जानते हैं कि उन्हें OS के किसी विशेष संस्करण में पेश किया गया था और उनसे OS संस्करण का संदर्भ लिया गया था। यह नाजुक है क्योंकि iOS के भविष्य के संस्करण इन सुविधाओं को हटा सकते हैं।
टिम डाउन

23
यह आपके चेक को लिखने का एक बेहतर तरीका है:var iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
LandonSchropp

5
बस एक नोट - navigator.platform सरणी iPad सिम्युलेटर पर काम नहीं करता है क्योंकि इसमें मंच स्ट्रिंग में पूरे वाक्यांश "iPad सिम्युलेटर" है।
केविन न्यूमैन

9
IOS 13 से iPad का उपयोगकर्ता एजेंट "मैक ओएस" में बदल गया है, उदाहरण के लिए: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15इसलिए इस उत्तर को अपडेट करने की आवश्यकता है
zvi

38

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

navigator.userAgentइस चेक के लिए उपयोग क्यों नहीं /iPad|iPhone|iPod/.test(navigator.platform)? ऐसा लगता है कि navigator.platformiPhone iOS के लिए हमेशा 'MacIntel' लौटाता है <= 12
Charis Theo

@CharisTheo क्योंकि iPad iOS में यूजरएजेंट में नहीं है> = 13
Kzrbill

लेकिन आप पहले से ही आईओएस iOS> = 13 के लिए दूसरी जांच कर रहे हैं या मैं कुछ याद कर रहा हूं?
चारिस थेओ

navigator.maxTouchPointsiOS में समर्थित नहीं है, ताकि चेक आपके लिए कुछ भी करने न जाए।
पॉलसी

@PaCC, आप सही हैं कि मैक्सटच पॉइंट्स iOS 12 और उससे नीचे के लिए अपरिभाषित हैं, लेकिन kikiwora सही रास्ते पर है क्योंकि iOS 13 में maxTouchPoints का समर्थन किया गया है। मेरा जवाब देखें।
बॉब अरलॉफ

14

यह चर _iOSDeviceको सही या गलत पर सेट करता है

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

3
क्या करता है !! करना?
पैट्रिक

4
@astronought डबल निगेटिव का इस्तेमाल बूलियन को करने के लिए किया जाता है
विटिम.स

2
@astronought धमाकेदार, तुम बुलियन हो: D
Qback

1
का उपयोग /iPhone|iPod|iPad/.test(navigator.platform)कर आप !!
lionello

10

अगर आप मॉडर्निज़्र का उपयोग कर रहे हैं , तो आप इसके लिए एक कस्टम परीक्षण जोड़ सकते हैं।

इससे कोई फ़र्क नहीं पड़ता है कि आप कौन सा डिटेक्शन मोड उपयोग करने का निर्णय लेते हैं (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');
}

2
केयरफुल बनें, मॉर्डनिज्र स्वचालित रूप से जोड़े गए परीक्षण के नाम को कम कर देता है। (आपके उदाहरण में, Modernizr.isiOS कभी भी सच नहीं लौटेगा)। मेरे विचार में
परिवाद

3
बस छोटे सूचना: यदि आप सरल बना सकते हैं return x ? true : falseकरने के लिए return Boolean(x)या सिर्फreturn !!x
tibalt


6

संस्करण का विस्तार करने के लिए एक सरलीकृत, आसान।

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

1
आप भी आईओएस सिम्युलेटर पर काम करने के लिए इस चाहते हैं तो आप उपयोग कर सकते हैं: navigator.platform.replace(' Simulator', '')
कोराक्टर

लेकिन यह काम नहीं करता है, कारण['str'].indexOf('string') == -1
tibalt

जब तक सिम्युलेटर नहीं चल रहा है, तो नेविगेटर.प्लेट रिकॉर्डर बिल्कुल 'आईपैड', 'आईफोन' या 'आईपॉड' होगा।
कोरी नून

4

यह शायद जवाब देने लायक है कि iOS 13 को चलाने वाले iPads navigator.platformसेट हो गए होंगे MacIntel, जिसका अर्थ है कि आपको iPadOS डिवाइसों का पता लगाने का एक और तरीका खोजना होगा।


3

मैंने इसे कुछ साल पहले लिखा था लेकिन मेरा मानना ​​है कि यह अभी भी काम करता है:

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

आईओएस उपकरणों पर उपयोगकर्ता-एजेंट कहते हैं कि उनमें iPhone या iPad है। मैं सिर्फ उन कीवर्ड के आधार पर फ़िल्टर करता हूं।


4
विचार करने के लिए आइपॉड टच भी है।
डगलस ग्रीनशील्ड्स

@DouglasGreenshields सही है। उस एक के बारे में भूल गया, लेकिन मेरा मानना ​​है कि यह उपयोगकर्ता-एजेंट में भी अपनी पहचान प्रसारित करता है।
ब्रायन नेगेले

आईपैड सफारी के उपयोगकर्ता एजेंट नहीं रह गया है iPadOS 13. से "iPad" शामिल होंगे
जॉनी

2

माडर्निज़्र टेस्ट को जोड़ने के दौरान जहां कहीं भी संभव हो, आपको डिवाइस या ऑपरेटिंग सिस्टम के बजाय एक सुविधा के लिए एक परीक्षण जोड़ना चाहिए। वहाँ iPhone के लिए सभी परीक्षण दस परीक्षणों को जोड़ने के साथ कुछ भी गलत नहीं है अगर यह है कि यह क्या लेता है। कुछ चीजों को सिर्फ फीचर नहीं किया जा सकता है।

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

उदाहरण के लिए iPhone (iPad नहीं) वीडियो को वेबपेज पर इनलाइन नहीं चलाया जा सकता है, यह पूरी स्क्रीन खोलता है। इसलिए मैंने एक टेस्ट बनाया 'नो-इन-पेज-वीडियो'

इसके बाद आप (Modernizr एक वर्ग कहते हैं सीएसएस में इसका उपयोग कर सकते .no-inpagevideoकरने के लिए <html>टैग करता है, तो परीक्षण विफल रहता है)

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

यह वीडियो को iPhone पर छिपा देगा (जो मैं वास्तव में इस मामले में कर रहा हूं वह वीडियो चलाने के लिए एक ऑन्कलिक के साथ एक वैकल्पिक छवि दिखा रहा है - मैं सिर्फ डिफ़ॉल्ट वीडियो प्लेयर और दिखाने के लिए प्ले बटन नहीं चाहता हूं)।


iOS10 अब playsinlineआप 'playsInline' in document.createElement('video');एक परीक्षण के रूप में उपयोग कर सकते हैं इसके लिए अनुमति देता है अब github.com/Modernizr/Modernizr/issues/2077
Simon_Weaver

2

वाह, यहाँ बहुत लंबा मुश्किल कोड है। कृपया इसे सरल रखें, कृपया!

यह एक IMHO तेज, बचाओ, और अच्छी तरह से काम कर रहा है:

 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 प्लेटफ़ॉर्म स्ट्रिंग के ^ tarting स्थिति को पहले चेक करता है और अगर कोई "iP" नहीं है तो रुक जाता है (वैसे भी अंत तक लंबे UA स्ट्रिंग को खोजने से अधिक)
  • यह UA जाँच से अधिक सुरक्षित है (नाविक मानकर। बैंडविड्थ की संभावना कम है)
  • IPhone / iPad सिम्युलेटर का पता लगाता है


अद्यतन: यह डेस्कटॉप मोड में iPad को कवर नहीं करता है (और इसलिए डिफ़ॉल्ट iPadOS 13)।
यह मेरे usecases के लिए ठीक है, अगर यह आपके लिए नहीं है, तो जस्टिन और किकिवोरा के जवाब देखें।


iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);इसके बजाय मैं iOS = /^(iPhone|iPad|iPod)/.test(navigator.userAgent || navigator.vendor || navigator.platform); अपने मामले में एक कमबैक उपाय cuz के रूप में करूँगा navigator.platform काम नहीं किया, लेकिन यह बाद में ठीक काम कर रहा है जैसे
Coderboi

navigator.platformकाम नहीं किया? क्या आप वास्तव में iOS पर हैं? Jeka.info/test/navigator.html के साथ जांचेंuserAgentझूठी सकारात्मकता देता है क्योंकि कुछ विक्रेता जो भी कारणों से Apple उपकरणों की नकल करने के लिए नकली हैं। vendorसिर्फ रिटर्न या तो Google Inc., Apple Computer, Inc.या कुछ भी नहीं है (फ़ायरफ़ॉक्स में)।
जे जे

1

थोड़ा और अधिक कार्यात्मक दृष्टिकोण का उपयोग करके पहले उत्तर को अपडेट करें।

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

बहादुर / क्रोम देव उपकरण मोबाइल सिम्युलेटर में काम नहीं करता है। मुझे मिलता हैMacIntel
sdfsdf

1

पिछले जवाबों में से कोई भी यहां iOS iOS के सभी संस्करणों पर सभी प्रमुख ब्राउज़रों के लिए काम नहीं करता है, जिसमें iOS 13 भी शामिल है। यहां एक समाधान है जो सभी iOS संस्करणों के लिए सफारी, क्रोम और फ़ायरफ़ॉक्स के लिए काम करता है:

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()));
})();

ध्यान दें कि यह कोड स्निपेट पठनीयता पर प्राथमिकता के साथ लिखा गया था, न कि सहमति या प्रदर्शन पर।

स्पष्टीकरण:

  • यदि उपयोगकर्ता एजेंट में "iPod | iPhone | iPad" में से कोई भी है, तो स्पष्ट रूप से डिवाइस iOS है। अन्यथा, जारी रखें ...

  • कोई भी अन्य उपयोगकर्ता एजेंट जिसमें "Macintosh" शामिल नहीं है वह Apple डिवाइस नहीं है और इसलिए वह iOS नहीं हो सकता है। अन्यथा, यह एक Apple डिवाइस है, इसलिए जारी रखें ...

  • यदि maxTouchPointsकिसी का मान 1अधिक या अधिक है, तो Apple डिवाइस में एक टच स्क्रीन है और इसलिए iOS होना चाहिए क्योंकि टच स्क्रीन के साथ कोई मैक नहीं हैं (उल्लेख करने के लिए kudos से kikiwora maxTouchPoints)। ध्यान दें कि maxTouchPointsहै undefinedआईओएस 12 के लिए और नीचे है, तो हम उस स्थिति के लिए एक अलग समाधान की आवश्यकता है ...

  • iOS 12 और उसके नीचे एक क्विक है जो Mac OS में मौजूद नहीं है। क्वर्की यह है कि volumeकिसी Audioतत्व की संपत्ति को इसके अलावा किसी भी मूल्य पर सफलतापूर्वक सेट नहीं किया जा सकता है 1। ऐसा इसलिए है क्योंकि Apple AudioiOS उपकरणों के लिए तत्व पर वॉल्यूम परिवर्तन की अनुमति नहीं देता है, लेकिन मैक ओएस के लिए करता है। मैक ओएस डिवाइस से आईओएस डिवाइस को अलग करने के लिए उस क्विकर को अंतिम फॉलबैक विधि के रूप में इस्तेमाल किया जा सकता है।


0

आप भी उपयोग कर सकते हैं includes

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

-1

मेरे मामले में उपयोगकर्ता एजेंट काफी अच्छा नहीं था क्योंकि आईपैड में उपयोगकर्ता एजेंट मैक ओएस में ही था, इसलिए मुझे एक बुरा चाल करना पड़ा:

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
}

बस उस सवाल को पढ़ें जो कहता है कि आईओएस का पता लगाएं, मोबाइल का पता न लगाएं
साइबरस्पेसनोवा

-2

IOS संस्करण का पता लगाने के लिए, किसी को इस तरह जावास्क्रिप्ट कोड के साथ उपयोगकर्ता एजेंट को नष्ट करना होगा:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.