确定用户是否从移动Safari导航

Ste*_*ven 56 javascript iphone mobile-safari web-clips

我有一个应用程序,我想根据用户导航的位置将用户重定向到不同的页面.

如果从Web剪辑导航,请不要重定向.如果从移动版Safari导航,请重定向到safari.aspx.如果从其他任何地方导航,请重定向到unavailable.aspx

我能够使用iPhone WebApps,有没有办法检测它是如何加载的?主屏与Safari?确定用户是否从Web剪辑导航,但我无法确定用户是否在iPhone或iPod上从移动Safari导航.

这就是我所拥有的:

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";
}
Run Code Online (Sandbox Code Playgroud)

unw*_*ing 135

请参阅https://developer.chrome.com/multidevice/user-agent#chrome_for_ios_user_agent - iOS上的Safari和iOS上的Chrome的用户代理字符串不太相似:

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);
Run Code Online (Sandbox Code Playgroud)

  • iOS上的Stupid Opera仍会在上面的代码中传递,所以我将最后一行更改为:var iOSSafari = iOS && webkit &&!ua.match(/ CriOS/i)&&!ua.match(/ OPiOS/i) ; (7认同)
  • +1这里唯一涵盖所有规格的答案.我只是将iOS测试正则表达式更改为`/ iP(ad | hone)/ i`,因此您不需要或. (5认同)
  • 这是一个非常好的答案.我不知道为什么这不是正确的答案...... (2认同)
  • @fabricioflores 这就是生活:( (2认同)
  • @sareed我总是非常满意能够对iP(ad | od | hone)进行正则表达式 (2认同)
  • 好答案。但是,为什么可以在使用test()时使用带有匹配项的双负(!!)? (2认同)

app*_*ter 26

最佳做法是:

function isMobileSafari() {
    return navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/)
}
Run Code Online (Sandbox Code Playgroud)

  • 这也适用于Chrome iOS :( http://stackoverflow.com/a/13808053/668157 (24认同)
  • 这也与桌面 Safari 匹配。 (2认同)

Dan*_*llo 22

更新:这是一个非常古老的答案,我不能删除它,因为答案被接受.检查下面的不知情的答案以获得更好的解决方案.


您应该能够在用户代理字符串中检查"iPad"或"iPhone"子字符串:

var userAgent = window.navigator.userAgent;

if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i)) {
   // iPad or iPhone
}
else {
   // Anything else
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是正确的答案,因为如果我从Chrome访问ios它将返回true (14认同)
  • 我认为不是.与safari iOS浏览器不同的是什么?我认为这个表达不仅会排除Safari,还会排除所有iphone/ipad浏览器. (10认同)
  • 这不起作用,因为用户现在可以在iOS上浏览移动Chrome,即使它不是Mobile Safari,这仍然会返回true. (6认同)
  • 这不应被标记为正确答案,因为它包括在 iPhone 上运行的任何浏览器。该问题专门询问检测移动野生动物园。 (3认同)
  • 这不会检测用户是否使用移动Chrome.与Safari相比,Chrome iOS有一个非常古老的javascript引擎(由于Apple的政策),使得一些渲染变得不可能. (2认同)

Кон*_*Ван 6

合并所有答案和评论。这是结果。

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


// Usage:
// if iOSSafari(window.navigator.userAgent) { /* iOS Safari code here */ }

// Testing:
var iPhoneSafari = [
  "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
  "Mozilla/5.0 (Apple-iPhone7C2/1202.466; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3",
  "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1",
  "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
  "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5370a Safari/604.1",
  "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1",
  "Mozilla/5.0 (iPhone9,3; U; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A403 Safari/602.1",
  "Mozilla/5.0 (iPhone9,4; U; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A403 Safari/602.1",
];
console.log("All true:", iPhoneSafari.map(iOSSafari));

var iPhoneNotSafari = [
  "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/69.0.3497.105 Mobile/15E148 Safari/605.1",
  "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/13.2b11866 Mobile/16A366 Safari/605.1.15",
];
console.log("All false:", iPhoneNotSafari.map(iOSSafari));
Run Code Online (Sandbox Code Playgroud)


aWe*_*per 5

下降的代码只找到移动safari而不是其他东西(除了海豚和其他小浏览器)

  (/(iPad|iPhone|iPod)/gi).test(userAgent) &&
  !(/CriOS/).test(userAgent) &&
  !(/FxiOS/).test(userAgent) &&
  !(/OPiOS/).test(userAgent) &&
  !(/mercury/).test(userAgent)
Run Code Online (Sandbox Code Playgroud)


ant*_*129 5

看到所有答案,以下是有关提议的 RegEx 的一些提示:

  • AppleWebKit 也与桌面 Safari 匹配(不仅是移动设备)
  • .match对于这种简单的正则表达式,不需要多次调用,并且更喜欢更轻的.test方法。
  • g(全局)的正则表达式标志为无用,而i(不区分大小写)可以是有用的
  • 不需要捕获(括号),我们只是测试字符串

我只是使用它,因为true移动 Chrome 对我来说是可以的(相同的行为):

/iPhone|iPad|iPod/i.test(navigator.userAgent)
Run Code Online (Sandbox Code Playgroud)

(我只想检测设备是否是 iOS 应用程序的目标)

  • 关于正则表达式的重要说明(一般),感谢您在这里指出这一点(大多数人都弄错了)!除了您的答案之外,现在还应该检查“!window.MSStream”,以根据另一个问题的 [this answer](/sf/answers/632791981/) 排除微软的浏览器。并且 `!/CriOS/.test(navigator.userAgent)` 适合那些希望按照 [this answer](/sf/answers/966563741/) 过滤掉 Chrome 的人。 (2认同)