سؤال

لديّ تطبيق ، وأرغب في إعادة توجيه المستخدمين إلى صفحات مختلفة بناءً على المكان الذي يتنقلون منه.

إذا كان التنقل من مقطع الويب ، لا تعيد التوجيه. إذا كان التنقل من Safari المتنقل ، إعادة التوجيه إلى Safari.aspx. إذا كان التنقل من أي مكان آخر ، فأعد التوجيه إلى غير متوفر. aspx

كنت قادرا على استخدام iPhone WebApps ، هل هناك طريقة لاكتشاف كيفية تحميلها؟ الشاشة الرئيسية مقابل Safari؟ لتحديد ما إذا كان المستخدم يتنقل من مقطع ويب ، لكنني أواجه مشكلة في تحديد ما إذا كان المستخدم قد انتقل من Safari المحمول على iPhone أو iPod.

هذا ما لدي:

if (window.navigator.standalone) {
    // user navigated from web clip, don't redirect
}
else if (/*logic for mobile Safari*/) {
    //user navigated from mobile Safari, redirect to safari page
    window.location = "safari.aspx";
}
else {
    //user navigated from some other browser, redirect to unavailable page
    window.location = "unavailable.aspx";
}
هل كانت مفيدة؟

المحلول

تحديث: هذه إجابة قديمة جدًا ولا يمكنني حذفها لأن الإجابة مقبولة. الشيك إجابة uniitting أدناه لحل أفضل.


يجب أن تكون قادرًا على التحقق من فرعية "iPad" أو "iPhone" في وكيل المستخدم سلسلة:

var userAgent = window.navigator.userAgent;

if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i)) {
   // iPad or iPhone
}
else {
   // Anything else
}

نصائح أخرى

يرى https://developer.chrome.com/multidevice/user-agent#chrome_for_ios_user_agent - تتشابه سلاسل وكيل المستخدم لـ Safari على iOS و chrome على iOS بشكل غير مريح:

كروم

Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3

سفاري

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3

يبدو أن أفضل طريقة هنا هو أولاً وقبل كل شيء التحقق من نظام التشغيل iOS كما اقترحت الإجابات الأخرى ، ثم تصفية على الأشياء التي تجعل Safari UA فريدة من نوعها ، والتي أقترح أن يتم إنجازها بشكل أفضل مع "هل Applewebkit وليس Crios":

var ua = window.navigator.userAgent;
var iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);
var webkit = !!ua.match(/WebKit/i);
var iOSSafari = iOS && webkit && !ua.match(/CriOS/i);

أفضل الممارسات هي:

function isMobileSafari() {
    return navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/)
}

الرمز المتساقط فقط ابحث عن Safari المحمول ولا شيء آخر (باستثناء الدلفين والمتصفحات الصغيرة الأخرى)

  (/(iPad|iPhone|iPod)/gi).test(userAgent) &&
  !(/CriOS/).test(userAgent) &&
  !(/FxiOS/).test(userAgent) &&
  !(/OPiOS/).test(userAgent) &&
  !(/mercury/).test(userAgent)

دمج جميع الإجابات والتعليقات. وهذه هي النتيجة.

function iOSSafari(userAgent)
{
    return /iP(ad|od|hone)/i.test(userAgent) && /WebKit/i.test(userAgent) && !(/(CriOS|FxiOS|OPiOS|mercury)/i.test(userAgent));
}



var iOSSafari = /iP(ad|od|hone)/i.test(window.navigator.userAgent) && /WebKit/i.test(window.navigator.userAgent) && !(/(CriOS|FxiOS|OPiOS|mercury)/i.test(window.navigator.userAgent));

رؤية جميع الإجابات ، إليك بعض النصائح حول regexes المقترحة:

  • AppleWebKit تطابق Safari سطح المكتب أيضًا (ليس فقط الهاتف المحمول)
  • لا حاجة للاتصال .match أكثر من مرة لمثل هذه regexes البسيطة ، ويفضل أخف وزنا .test طريقة.
  • ال g (Global) regex علامة عديمة الفائدة بينما i (حالة غير حساسة) يمكن أن تكون مفيدة
  • لا حاجة لالتقاط (قوسين) ، نحن فقط نختبر السلسلة

أنا فقط أستخدم هذا منذ الحصول عليه true بالنسبة للكروم المتنقل على ما يرام بالنسبة لي (السلوك نفسه):

/iPhone|iPad|iPod/i.test(navigator.userAgent)

(أريد فقط اكتشاف ما إذا كان الجهاز هدفًا لتطبيق iOS)

في الواقع ، لا يوجد رصاصة فضية لاكتشاف سفاري المتنقل. هناك عدد غير قليل من المتصفحات قد تستخدم الكلمات الرئيسية لوكيل المستخدم في Safari المحمول. ربما يمكنك تجربة اكتشاف الميزة والاستمرار في تحديث القاعدة.

لقد قمت بإصابة إجابة unwitting ، حيث جعلني حتماً. ومع ذلك ، عند تقديم المنتجع الصحي الخاص بي في عرض iOS على الويب ، كنت بحاجة إلى تعديله قليلاً.

function is_iOS () {
    /*
        Returns whether device agent is iOS Safari
    */
    var ua = navigator.userAgent;
    var iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);
    var webkitUa = !!ua.match(/WebKit/i);

    return typeof webkit !== 'undefined' && iOS && webkit && !ua.match(/CriOS/i);
};

الفرق الرئيسي هو إعادة تسمية webkit ل webkitUa, ، وذلك لمنع الاشتباك مع الجذر webkit الكائن المستخدم كمعالج للرسالة بين المنتجع الصحي و Uiview.

function isIOS {
  var ua = window.navigator.userAgent;
  return /(iPad|iPhone|iPod).*WebKit/.test(ua) && !/(CriOS|OPiOS)/.test(ua);
}

أعلم أن هذا موضوع قديم ، لكنني أود مشاركة الحل معكم يا رفاق.

كنت بحاجة إلى اكتشاف عندما ينتقل المستخدم من Safari سطح المكتب (لأننا في منتصف عام 2017 ، ولم تقدم Apple أي دعم لـ input[type="date"] بعد...

لذلك ، قمت بإعداد مخصص للتاريخ المخصص لذلك). ولكن لا ينطبق إلا على Safari في سطح المكتب لأن نوع الإدخال هذا يعمل بشكل جيد في Safari المحمول. لذلك ، جعلت هذا regex لاكتشاف فقط Safari سطح المكتب. لقد اختبرته بالفعل ولا يتطابق مع الأوبرا أو الكروم أو Firefox أو Safari Mobile.

آمل أن يساعد ذلك بعضكم يا رفاق.

if(userAgent.match(/^(?!.*chrome).(?!.*mobile).(?!.*firefox).(?!.*iPad).(?!.*iPhone).*safari.*$/i)){
  $('input[type="date"]').each(function(){
    $(this).BitmallDatePicker();
  })
}

كنت أبحث عن هذه الإجابة وتذكرت أنني صادفت هذا من قبل.

الطريقة الأكثر موثوقية لاكتشاف Safari على iOS في JavaScript

if (window.outerWidth === 0) {
    // Code for Safari on iOS
} 

or 

if (window.outerHeight === 0) {
    // Code for Safari on iOS
} 

لسبب ما ، إرجاع Safari on iOS 0 لـ Window.outerHeight Property and Window.outerWidth Property.

هذا لجميع أجهزة iPad و iPhone على جميع إصدارات iOS. كل متصفح آخر وجهاز يعمل هذا الخاصية بشكل طبيعي.

لست متأكدًا مما إذا كانوا يعتزمون تغيير هذا ولكن الآن يعمل بشكل جيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top