जावास्क्रिप्ट के माध्यम से ipad / iphone वेबव्यू का पता लगाएं


91

अगर वेबसाइट ipad सफारी के अंदर या अनुप्रयोग WebView के अंदर चलती है, तो क्या जावास्क्रिप्ट के माध्यम से अंतर करने का एक तरीका है?


क्या यह सिर्फ iOS उपकरणों के लिए है?
निकोलस एस

जवाबों:


79

इस का एक संयोजन का उपयोग करता है window.navigator.userAgentऔर window.navigator.standalone। यह एक iOS वेब ऐप से संबंधित सभी चार राज्यों में अंतर कर सकता है: सफारी (ब्राउज़र), स्टैंडअलोन (फुलस्क्रीन), uiwebview, और iOS नहीं।

डेमो: http://jsfiddle.net/ThinkingStiff/6qrbn/

var standalone = window.navigator.standalone,
    userAgent = window.navigator.userAgent.toLowerCase(),
    safari = /safari/.test( userAgent ),
    ios = /iphone|ipod|ipad/.test( userAgent );

if( ios ) {
    if ( !standalone && safari ) {
        //browser
    } else if ( standalone && !safari ) {
        //standalone
    } else if ( !standalone && !safari ) {
        //uiwebview
    };
} else {
    //not iOS
};

SafariuserAgent में क्रोम है । webcal://.ics फ़ाइलों के लिए प्रोटोकॉल की आवश्यकता के संबंध में यह अलग तरह से व्यवहार करता है
neaumusic

@svlada क्या आप अधिक जानकारी प्रदान कर सकते हैं? आपका उपकरण और इसका iOS संस्करण क्या था?
sonlexqt

78

उपयोगकर्ता एजेंट

UIWebView में चल रहा है

Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/98176

आईपैड पर सफारी में चल रहा है

Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3

मैक ओएस एक्स पर सफारी में चल रहा है

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.5 Safari/534.55.3

मैक ओएस एक्स पर क्रोम में चल रहा है

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19

मैक ओएस एक्स पर फायरफॉक्स में चल रहा है

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0

डिटेक्शन कोड

var is_uiwebview = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent);
var is_safari_or_uiwebview = /(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent);

वास्तव में। मुझे नहीं पता कि मैंने सिर्फ पहली बार खुद ही दोनों उपयोगकर्ताओं को क्यों देखा। आपके उत्तर के लिए धन्यवाद :)
sod

4
IPhone 5s / iOS 7 पर काम नहीं कर रहा है, क्योंकि दोनों UIWebViewऔर सफारी Safariउनके उपयोगकर्ता एजेंट में हैं
रेजर

@ रेजर आप सही कह रहे हैं। नवीनतम iOS में मेरे Versionलिए Safariकाम करने के विरोध में परीक्षण ।
अपरस

1
@unceus क्या आप कृपया इस बात की रूपरेखा तैयार कर सकते हैं कि आपका क्या मतलब है Version? आप की जगह है Safariसाथ Versionमें var is_uiwebviewलाइन?
हेनरिक पीटरसन

@HenrikPetterson उपयोगकर्ता एजेंट स्ट्रिंग्स के संबंध में, ऊपर के पहले दो उपयोगकर्ता एजेंट स्ट्रिंग्स (UIWebView, और iPad पर Safari) की तुलना में UIWebView स्ट्रिंग में 'संस्करण' शामिल है जबकि iPad एक नहीं करता है। रेगेक्स को संशोधित करने के साथ आपका लक्ष्य स्पष्ट नहीं है, और ऐसा लगता है कि आप एक लिखने में मदद की तलाश कर रहे हैं।
अपराह्न

10

मुझे लगता है कि आप बस का उपयोग कर सकते हैं User-Agent


अपडेट करें

पेज आईफोन सफारी का उपयोग करके ब्राउज किया गया

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7

मैं UIWebView के साथ एक सेकंड में कोशिश करूंगा

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Mobile/8B117

अंतर यह है कि सफारी एक कहता है Safari/6531.22.7


उपाय

var isSafari = navigator.userAgent.match(/Safari/i) != null;

हाँ, लेकिन क्या आपके पास कोई विचार है अगर उपयोगकर्ता-एजेंट में UIWebView का पता लगाने के लिए एक विशिष्ट स्ट्रिंग या कुछ है? अब तक मुझे कुछ भी नहीं मिला ...
Adam Tal

क्या यह सिर्फ iOS उपकरणों के लिए है?
निकोलस एस

निकोलस संख्या इस समय अलग-अलग होगी क्योंकि सफारी और UIWebView (और "स्टैंड-अलोन" -ie होम स्क्रीन- वेब ऐप) विभिन्न इंजनों का उपयोग करते हैं। IOS 5 में यह बदलाव
बेन

मुझे संख्याओं से मतलब नहीं है, मेरा मतलब Safari/.....है कि UIWebView में खुद गायब है
निकोलस एस

@ निकोलस: काफी सही, माफ करना मैं ध्यान नहीं दे रहा था। मुझे आश्चर्य है कि अगर कोई यह पुष्टि कर सकता है कि क्या यह अभी भी iOS5 में है?
बेन

7

हाँ:

// is this an IPad ?
var isiPad = (navigator.userAgent.match(/iPad/i) != null);

// is this an iPhone ?
var isiPhone = (navigator.userAgent.match(/iPhone/i) != null);

// is this an iPod ?
var isiPod = (navigator.userAgent.match(/iPod/i) != null);

11
यह न केवल WebView से सफारी ब्राउज़र से भी मेल खाएगा।
पेट्र पेलर

@ThinkingStuff - क्या आप मुझे मैक ओएस (डेस्कटॉप ब्राउजर) और आईपैड सफारी ब्राउजर के बीच डायफरेंटिएट की मदद करने में मदद कर सकते हैं - stackoverflow.com/questions/58344491/…
newdeveloper

5

मैंने इन सभी समाधानों की कोशिश की है, लेकिन मेरे मामले में काम नहीं किया,
मैं वेबव्यू के अंदर टेलीग्राम का पता लगाने जा रहा था । मैंने देखा है कि सफारी फोन शैली के टेक्स्ट को "tel:" उपसर्ग के साथ लिंक में बदल रही है, इसलिए मैंने इस कोड को लिखने के लिए इसका उपयोग किया है, आप इसका परीक्षण कर सकते हैं: jsfiddle

<!DOCTYPE html>
<html>
<head></head>
<body>
<ul id="phone" style="opacity:0">
    <li>111-111-1111</li>
</ul>
</body>
</html>

<script>

    var html = document.getElementById("phone").innerHTML;

    if (navigator.platform.substr(0,2) === 'iP') {

        if (html.indexOf('tel:') == -1)
            alert('not safari browser');
        else
            alert('safari browser');
    }
    else
        alert('not iOS');
</script>

1
आपको इस तरह की चाल पर भरोसा नहीं करना चाहिए क्योंकि उपयोगकर्ता या कोई अन्य डेवलपर टेलीफोन पहचान को अक्षम कर सकता है।
Бодров Андрей

@ БодровАндрей मैं आपसे सहमत हूँ, लेकिन यही एक तरीका था जिससे मैं मिल सकता था, मुझे आशा है कि Apple भविष्य में इसके लिए अलग-अलग User-Agent उपलब्ध कराएगा
अमीर खोरसांडी

खबरदार यह iOS 13 पर बोर्केन है, क्योंकि यदि डेस्कटॉप मोड का उपयोग किया जाता है, तो navigator.platform === 'MacIntel'। यह विशेष रूप से iPadOS 13 मोबाइल सफारी को प्रभावित करता है क्योंकि यह डिफ़ॉल्ट रूप से डेस्कटॉप मोड का उपयोग करता है।
रोबोकट

@ बरोकट आप सही कह रहे हैं। आईओएस 13 आईपैड में इसकी टूटी हुई है और मैं अभी बिना किसी समाधान के फंस गया हूं। क्या आप कृपया मुझे संबंधित प्रश्न के साथ मदद कर सकते हैं यहां stackoverflow.com/questions/58344491/…
newdeveloper

2

नियोनी का समाधान अब काम नहीं करता (टिप्पणियों को देखें) और इसे सरल बनाया जा सकता है। दूसरी ओर, यूए में केवल "सफारी" का परीक्षण, आईओएस हाथ में लेने वाले उपकरणों की तुलना में बहुत अधिक है।

यह परीक्षण मैं उपयोग कर रहा हूँ:

var is_ios = /(iPhone|iPod|iPad).*AppleWebKit.*Safari/i.test(navigator.userAgent);

2

ध्यान दें कि यह दृष्टिकोण iOS 10 और पुराने संस्करणों के लिए काम नहीं करता है।

2018 के वसंत के लिए किसी भी प्रस्तावित विधि ने मेरे लिए काम नहीं किया इसलिए मैं एक नया दृष्टिकोण (जो उपयोगकर्ता आधारित नहीं है) के साथ आया:

const hasValidDocumentElementRatio =
  [ 320 / 454 // 5, SE
  , 375 / 553 // 6, 7, 8
  , 414 / 622 // 6, 7, 8 Plus
  , 375 / 812 // X
  , 414 / 896 // Xs, Xr
  ].some(ratio =>
    ratio === document.documentElement.clientWidth / 
      document.documentElement.clientHeight
  )

const hasSafariInUA = /Safari/.test(navigator.userAgent)

const isiOSSafari = hasSafariInUA && hasValidDocumentElementRatio  // <- this one is set to false for webviews

https://gist.github.com/BorisChumichev/7c0ea033daf33da73306a396ffa174d1

आईपैड उपकरणों के लिए भी कोड का विस्तार करने के लिए आपका स्वागत है, मुझे लगता है कि यह चाल करना चाहिए।

टेलीग्राम, फेसबुक, वीके वेब साक्षात्कार के लिए अच्छी तरह से काम किया।


IPhone X के लिए यह 375/812 होगा, यह भी नया: iPhone Xs Max / Xr के लिए 414/896
ओलेग

1

Working 15.02.19

IOS पर वेबव्यू का पता लगाने के लिए एक अन्य समाधान समर्थन / अस्तित्व के लिए जाँच कर रहा है navigator.mediaDevices

if (navigator.mediaDevices) {
    alert('has mediaDevices');
} else {
    alert('has no mediaDevices');
}

मेरे मामले में मुझे सभी वेब साक्षात्कारों को पकड़ने की आवश्यकता नहीं थी, लेकिन जो कैमरा / माइक्रोफोन इनपुट का समर्थन नहीं करते हैं (अनुस्मारक: अलर्ट वेबव्यू में ट्रिगर नहीं होते हैं, इसलिए डीबग उद्देश्यों के लिए डोम में कुछ बदलना सुनिश्चित करें)


0

मुझे पता है कि यह कोड यह जांच करेगा कि क्या इसे होम स्क्रीन पर जोड़े गए आइकन से एक्सेस किया जा रहा है:

if (window.navigator.standalone == true) {
//not in safari
}

लेकिन मुझे यकीन नहीं है कि यह UIWebView में कैसे प्रतिक्रिया देगा। एकमात्र ऐसा उपाय जिसके बारे में मैं सोच सकता था कि उपयोगकर्ता एजेंट प्राप्त कर रहा है या - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationTypeउस पृष्ठ के क्वेरी स्ट्रिंग का उपयोग कर रहा है, जिसे आप किसी वेब दृश्य से एक्सेस करने के लिए उपयोग कर रहे हैं।


धन्यवाद, मैं उस कोड का उपयोग कर रहा था, लेकिन अधिक नियंत्रण की आवश्यकता है। यह केवल स्टैंडअलोन मोड का पता लगाने के लिए लगता है, और बाकी को सफारी मानता है।
आदम ताल

0

का उपयोग करते हुए सुझाव है कि Modernizr , और जैसे IndexedDB के लिए जाँच इस । आप उपयोगकर्ता एजेंट कॉन्फ़िगरेशन (डिवाइस, ओएस, ब्राउज़र, आदि) के साथ क्रॉस-चेक कर सकते हैं, लेकिन शुद्ध सुविधा का पता लगाना अधिक अनुशंसित है।


एक योजना की तरह लगता है लेकिन आप किन विशेषताओं के लिए परीक्षण करेंगे? indexeddb यानी क्रोम, फ़ायरफ़ॉक्स आदि का हिस्सा है
SSED

0

पिछली बार जब मुझे इसकी आवश्यकता थी (WebView उद्देश्यों के लिए JUST), मैंने इस चेक का उपयोग किया:

function isIOS() {
     return !/safari/.test( window.navigator.userAgent.toLowerCase()) || navigator.platform === 'iOS' || navigator.platform === 'iPhone';
}

यह iOS13 डेस्कटॉप मोड में टूट गया है (प्लेटफॉर्म अब आईपैड या आईफोन पर सेट नहीं है), और आईपॉड टच (प्लेटफॉर्म "आईपॉड" या "आईपॉड टच" हो सकता है)।
रोबोकट

0

मैंने iPhone या iPad का पता लगाने के लिए एक सरल समाधान ढूंढ लिया है। यह मेरे लिए ठीक काम करता है।

var is_iPad = navigator.userAgent.match(/iPad/i) != null;
var is_iPhone = navigator.userAgent.match(/iPhone/i) != null;
    if(is_iPad || is_iPhone == true){
        //perform your action
    }

0

IOS 13 के साथ प्रयास करें

      function mobileDetect() {


    var agent = window.navigator.userAgent;
    var d = document;
    var e = d.documentElement;
    var g = d.getElementsByTagName('body')[0];
    var deviceWidth = window.innerWidth || e.clientWidth || g.clientWidth;

    // Chrome
    IsChromeApp = window.chrome && chrome.app && chrome.app.runtime;

    // iPhone
    IsIPhone = agent.match(/iPhone/i) != null;

    // iPad up to IOS12
    IsIPad = (agent.match(/iPad/i) != null) || ((agent.match(/iPhone/i) != null) && (deviceWidth > 750)); // iPadPro when run with no launch screen can have error in userAgent reporting as an iPhone rather than an iPad. iPadPro width portrait 768, iPhone6 plus 414x736 but would probably always report 414 on app startup

    if (IsIPad) IsIPhone = false;

    // iPad from IOS13
    var macApp = agent.match(/Macintosh/i) != null;
    if (macApp) {
        // need to distinguish between Macbook and iPad
        var canvas = document.createElement("canvas");
        if (canvas != null) {
            var context = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
            if (context) {
                var info = context.getExtension("WEBGL_debug_renderer_info");
                if (info) {
                    var renderer = context.getParameter(info.UNMASKED_RENDERER_WEBGL);
                    if (renderer.indexOf("Apple") != -1) IsIPad = true;
                }
                ;
            }
            ;
        }
        ;
    }
    ;

    // IOS
    IsIOSApp = IsIPad || IsIPhone;

    // Android
    IsAndroid = agent.match(/Android/i) != null;
    IsAndroidPhone = IsAndroid && deviceWidth <= 960;
    IsAndroidTablet = IsAndroid && !IsAndroidPhone;



    message = ""


    if (IsIPhone) {

        message = "Device is IsIPhone"


    }
    else if (IsIPad) {

        message = "Device is ipad"

    } else if (IsAndroidTablet || IsAndroidPhone || IsAndroid) {

        message = "Device is Android"


    } else {

        message = "Device is Mac ||  Windows Desktop"

    }


    return {

        message: message,

        isTrue: IsIOSApp || IsAndroid || IsAndroidTablet || IsAndroidPhone

    }

}



const checkMobile = mobileDetect()

alert(checkMobile.message + "  =====>  " + checkMobile.isTrue)

-2

मुझे नहीं लगता कि क्लाइंट-साइड जावास्क्रिप्ट में आप कुछ विशिष्ट का उपयोग कर सकते हैं, लेकिन यदि आपके पास इस बात पर नियंत्रण है कि मूल UIWebView क्या कर सकता है, तो आप इसे उत्पन्न करने वाले उपयोगकर्ता एजेंट स्ट्रिंग के साथ खेलने पर विचार कर सकते हैं, और आपके लिए परीक्षण कर सकते हैं इसके बजाय क्लाइंट-साइड जावास्क्रिप्ट? थोड़ा सा हैक मुझे पता है, लेकिन हे ... यह सवाल उपयोगकर्ता एजेंट को ट्विक करने पर कुछ संकेत दे सकता है:

UIWebView (iPhone SDK) में उपयोगकर्ता एजेंट बदलें


धन्यवाद, बेन। दुर्भाग्य से मेरे पास ऐप के UIWebView उपयोगकर्ता एजेंट पर नियंत्रण नहीं है।
आदम ताल

-7

@ सोद, मेरे पास कोई उत्तर नहीं है, लेकिन मैं आश्वस्त नहीं हूं कि आप क्यों जांचना चाहते हैं, चूंकि, ब्राउज़र इंजन चाहे इसकी सफारी (ब्राउज़र) या एप्लिकेशन केवल इसका वेबकिट ही होगा, हां एप्लिकेशन ब्राउज़र इंजन क्षमताओं को कॉन्फ़िगर कर सकता है जैसे , चाहे आवेदन जेएस या डिस्प्ले इमेज आदि चलाना चाहता हो…

मेरा मानना ​​है कि, आपको निश्चित संपत्ति की जाँच करनी चाहिए कि फ़्लैश ब्राउज़र द्वारा समर्थित है या नहीं, ब्राउज़र छवि प्रदर्शित करता है या नहीं, या हो सकता है कि आप स्क्रीन आकार की जांच करना चाहते हों,


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