C# asp.net中的移动设备检测

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13086856/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 01:35:11  来源:igfitidea点击:

Mobile Device Detection in asp.net

c#asp.net

提问by Bisileesh

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?

任何人都可以提出更好的方法吗?

回答by Aristos

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.
  • Other checks.
  • 静态编译 Regex 以加快检查速度。
  • 修复 u 少于 4 个字符的情况下的错误。
  • 其他检查。

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.

这段代码很快,一个技巧是我们已经静态并预编译了正则表达式。我如何建议在第一次检查后将结果保存在用户会话中并使用更快的会话变量。

回答by Lars Holdgaard

Well yes, if you want to be sure the useragent is probably the best way. You can also look at this method:

嗯,是的,如果你想确定 useragent 可能是最好的方法。你也可以看看这个方法:

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.

它应该与新浏览器等存在一些问题。但这就是你目前所做的。

回答by Daniel A. White

Scott Hanselman has a great blog poston the subject. He refers to a 3rd party solution called 51Degrees.

Scott Hanselman 有一篇关于这个主题的很棒的博客文章。他提到了称为 51Degrees 的第 3 方解决方案。

回答by James

I would suggest storing the list of user agents in the web.config to make it easier to configure. IsMobileDeviceis not actively updated with new browsers therefore it does have it's limitations which is why you need the further check.

我建议将用户代理列表存储在 web.config 中,以便于配置。IsMobileDevice没有使用新浏览器主动更新,因此它确实有其局限性,这就是您需要进一步检查的原因。

The 51Degrees.mobipackage would be a more reliable alternative.

51Degrees.mobi包将是一个更加可靠的选择。

回答by Josh

The existing browser definitions are terrible. Ideally you want to use the WURFL databaseto 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

回答by Al Belmondo

Check the UserAgent in codebehind for "Mobi" similar to javascript referenced here.

检查代码隐藏中的 UserAgent 以查找类似于此处引用的 javascript 的“Mobi” 。

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

回答by Manjunath Bilwar

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 属性

回答by Eric Herlitz

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

正则表达式可以在包目录中找到