简体   繁体   English

asp.net中的移动设备检测

[英]Mobile Device Detection in asp.net

The following is a Mobile device detection code which encompasses three different conditions 以下是移动设备检测代码,其包含三种不同的条件

if (Request.Browser.IsMobileDevice)
{
   //Do Something
}
else if (((System.Web.Configuration.HttpCapabilitiesBase)myBrowserCaps).IsMobileDevice)
{
  //Do Something
}
else if (IsMobileDevice(mobileDevices))
{
  //Do Something
}

public bool IsMobileDevice()
{
     private static string[] mobileDevices = new string[] {"iphone","ppc"
                                                   "windows ce","blackberry",
                                                   "opera mini","mobile","palm"
                                                   "portable","opera mobi" };

         string userAgent = Request.UserAgent.ToString().ToLower();
         return mobileDevices.Any(x => userAgent.Contains(x));
 }

I was forced to write three conditions as they were failing for some devices. 我被迫写了三个条件,因为他们没有使用某些设备。

Can anyone suggest a better approach? 有谁能建议更好的方法?

taking and change a bit the code from : http://detectmobilebrowsers.com/ 从以下代码中获取并更改代码: http//detectmobilebrowsers.com/

public static class Utils
{    
    // update : 5/April/2018
    static Regex MobileCheck = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|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|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled);
    static Regex MobileVersionCheck = 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 | RegexOptions.Multiline | RegexOptions.Compiled);

    public static bool fBrowserIsMobile()
    {
        Debug.Assert(HttpContext.Current != null);

        if (HttpContext.Current.Request != null && HttpContext.Current.Request.ServerVariables["HTTP_USER_AGENT"] != null)
        {
            var u = HttpContext.Current.Request.ServerVariables["HTTP_USER_AGENT"].ToString();

            if (u.Length < 4)
                return false;

            if (MobileCheck.IsMatch(u) || MobileVersionCheck.IsMatch(u.Substring(0, 4)))
                return true;
        }

        return false;
    }
}

and this is how you call it. 这就是你怎么称呼它。

if (Utils.fBrowserIsMobile())
{
    // go to mobile pages
}

What I have change to the code from http://detectmobilebrowsers.com/ 我从http://detectmobilebrowsers.com/更改了代码

  • Make static compile the Regex for faster check. 使静态编译正则表达式以便更快地检查。
  • Fix a bug in the case that u is less than 4 characters. 修复u小于4个字符的情况。
  • Other checks. 其他检查。

Using Cache 使用缓存

This code is fast, and the one trick is that we have made static and pre compile the regex. 这段代码很快,一个技巧是我们已经制作了静态和预编译正则表达式。 How ever i suggest after the first check to save the result on user session and use that session variable that is a lot faster. 我在第一次检查后建议将结果保存在用户会话中并使用更快的会话变量。

Scott Hanselman has a great blog post on the subject. Scott Hanselman有一篇关于这个主题的博文 He refers to a 3rd party solution called 51Degrees. 他提到了一个名为51Degrees的第三方解决方案。

This code works in my case. 这段代码适用于我的情况。

public void IsMobileBrowser()
{
    String labelText = "";
    System.Web.HttpBrowserCapabilities myBrowserCaps = Request.Browser;
    if (((System.Web.Configuration.HttpCapabilitiesBase)myBrowserCaps).IsMobileDevice)
    {
        labelText = "Browser is a mobile device.";
    }
    else
    {
        labelText = "Browser is not a mobile device.";
    }
    ScriptManager.RegisterStartupScript(this, this.GetType(), "", "alert('"+ labelText + "');", true);
}

Reference: HttpCapabilitiesBase.IsMobileDevice Property 参考: HttpCapabilitiesBase.IsMobileDevice属性

The existing browser definitions are terrible. 现有的浏览器定义很糟糕。 Ideally you want to use the WURFL database to augment those definitions. 理想情况下,您希望使用WURFL数据库来扩充这些定义。

Luckily this is pretty easy using the 51 Degrees.mobi library . 幸运的是,使用51 Degrees.mobi库非常容易。

There is also a Nuget package : 还有一个Nuget套餐

Install-Package 51Degrees.mobi

I would suggest storing the list of user agents in the web.config to make it easier to configure. 我建议在web.config中存储用户代理列表,以便更容易配置。 IsMobileDevice is not actively updated with new browsers therefore it does have it's limitations which is why you need the further check. IsMobileDevice没有使用新浏览器进行主动更新,因此它确实存在限制,这就是您需要进一步检查的原因。

The 51Degrees.mobi package would be a more reliable alternative. 51Degrees.mobi包将是一个更可靠的替代方案。

Check the UserAgent in codebehind for "Mobi" similar to javascript referenced here . 在代码隐藏中检查UserAgent中的“Mobi”,类似于此处引用的javascript。

                if (Request.UserAgent.Contains("Mobi") == true)
                {
                    DivToShowWhenMobileDevice.Style.Add("display", "");
                }
                else
                {
                    DivToShowWhenMobileDevice.Style.Add("display", "none");
                }

Well yes, if you want to be sure the useragent is probably the best way. 是的,如果你想确定useragent可能是最好的方法。 You can also look at this method: 您还可以查看此方法:

http://msdn.microsoft.com/en-us/library/system.web.configuration.httpcapabilitiesbase.ismobiledevice.aspx http://msdn.microsoft.com/en-us/library/system.web.configuration.httpcapabilitiesbase.ismobiledevice.aspx

It should have some issues with new browsers and such. 它应该与新浏览器等有一些问题。 But it's this one of as you currently do. 但正如你现在所做的那样。

I'm using DeviceDetector.NET since I often also need to separate smartphones and tablets 我正在使用DeviceDetector.NET,因为我经常还需要将智能手机和平板电脑分开

Install it Install-Package DeviceDetector.NET 安装它Install-Package DeviceDetector.NET

Then use it like this 然后像这样使用它

DeviceDetectorSettings.RegexesDirectory = "C:\\DeviceDetector.NET.3.11.4\\";
var dd = new DeviceDetector(Request.UserAgent);
dd.Parse();

var device = dd.GetDeviceName();

if(device == "tablet") {}
if(device == "smartphone") {}
if(device == "desktop") {}

/**
Possible returns
--
desktop
smartphone
tablet
feature phone
console
tv
car browser
smart display
camera
portable media player
phablet
**/

The regexes can be found in the packages directory 可以在packages目录中找到正则表达式

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM