3

我们已成功使用以下 asp.net 正则表达式对访问我们网站的移动浏览器进行服务器端检测(取自http://detectmobilebrowsers.com/

Public Shared Function IsMobileBrowser(httpUserAgentString As String) As Boolean

    ' set up user agent sniffing (http://detectmobilebrowsers.com/)

    Dim b As New Regex("(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino", RegexOptions.IgnoreCase)
    Dim v As New Regex("1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase)

    If (b.IsMatch(httpUserAgentString) Or v.IsMatch(Left(httpUserAgentString, 4))) Then
        Return True
    Else
        Return False
    End If

End Function

但是,当用户从 QR 阅读应用程序 (Qrafter) 打开网站时,我们收到了有关此失败的报告。这似乎是因为应用程序(至少在 iOS 上的 Qrafter 的情况下)通过在应用程序内部加载代码页面来“测试”网站。执行此操作时传递的用户代理字符串与移动浏览器测试不匹配,因此我们设置了一个会话变量,将站点模式存储为桌面/非移动,然后当站点完全加载时通过应用程序发生,它以桌面模式而不是移动模式启动。

应用程序呈现给我们的 ASP.net 代码的用户代理字符串是:

Qrafter/6.3+CFNetwork/609+Darwin/13.0.0 200 0 0 178

因此,我们使用以下正则表达式方法解决了这个问题,以检测和忽略网站的这些“应用内”负载

Public Shared Function IsAppSniffer(httpUserAgentString As String) As Boolean

    Dim b As New Regex("\bCFNetwork\b.+\bDarwin\b", RegexOptions.IgnoreCase)

    If (b.Matches(httpUserAgentString).Count > 0) Then
        Return True
    Else
        Return False
    End If

End Function

基本上,我想知道这是否是进行此测试的可靠方法,以及我们必须寻找什么来检测 Android / Windows / 其他运行 QRafter 等价物的手机上的类似问题?他们基于应用程序的用户代理字符串是什么?或者,由于其“URL 测试”功能,这可能是 iOS 上的 QRafter 应用程序特有的问题吗?

随意(如果可能的话,建设性地!)批评我们将移动/桌面站点模式存储在会话对象中的方法,但是我们在这个项目上重新设计它可能有点晚了。

为这个问题的冗长道歉,希望它仍然只是一个问答环节,非常感谢任何有用的信息。


编辑:正如斯蒂芬在下面指出的那样,简而言之,我的问题本质上是,“有没有一种实用的方法来检测直接从移动设备(任何风格)发送的用户代理字符串以及来自他们的移动浏览器的用户代理字符串?”

例如(对于 iOS / Safari 配对)直接来自应用程序

AppName/CFNetwork/609+Darwin/13.0.0 200 0 0 178

Safari 用户代理字符串

Mozilla/5.0+(iPhone;+CPU+iPhone+OS+6_0_1+like+Mac+OS+X)+AppleWebKit/536.26+(KHTML,+like+Gecko)+Mobile/10A523 200 0 0 20
4

2 回答 2

3

基本上,您的问题总结为:您通常可以检测到浏览器,但有时,您没有得到预期的用户代理字符串,并且您将桌面版本发送到移动设备。

您解决此问题的问题在于,每次出现这种情况时,您都需要修改检测正则表达式并使用新程序。虽然这可以在循环和数据库中的表中完成,但仍然需要大量维护和麻烦。不过,老实说,其他解决方案也是如此。必须有人维护“移动”浏览器的列表。那可以是您自己,也可以是您付费的服务。

我要做的是让桌面端对浏览器及其版本进行 JavaScript 检测(如何检测浏览器的版本?)。如果它检测到它恰好在移动设备上显示自己,则提供一个链接以将用户带到相关的移动页面。

当且仅当用户代理不在检测移动浏览器站点提供的列表中时,您可以更进一步,甚至将此逻辑添加到页面中。当然,这可能有点矫枉过正。

Sadly, at some point, you'll just have to say "We gave it our best shot at getting someone to the proper view of the site" and be happy with how its working. There's only so much automated detection that can be performed in this manner, and program designers will happily try ways to break said logic, just because they can.

于 2013-02-05T15:59:46.973 回答
2

您可以尝试使用51degrees.mobi 之类的东西进行浏览器检测,而不是滚动您自己的解决方案。具有各种怪癖的组合如此之多,很难推出自己的综合解决方案。

于 2013-02-05T15:57:14.260 回答