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
Mobile Device Detection in 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 可能是最好的方法。你也可以看看这个方法:
It should have some issues with new browsers and such. But it's this one of as you currently do.
它应该与新浏览器等存在一些问题。但这就是你目前所做的。
回答by Daniel A. White
回答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
回答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
正则表达式可以在包目录中找到

