ASP.net User Agent detection of mobile applications loading the site

We have successfully used the following asp.net regex for server side detection of mobile browsers visiting our site (taken from 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

      

However, we got reports of this crash when users opened the site from QR reader apps (Qrafter). It seems to be related to the application (in the case of Qrafter, at least on iOS), "testing" the site by loading the page into code inside the application. The User Agent string passed in did not match the mobile browser test, so we set a session variable to keep the site mode as desktop / non-mobile, and then when the site was fully loaded through the app, it started in run mode instead of in mobile.

The User Agent string represented by our ASP.net code was:

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

      

So we worked on it with the following regex method to detect and ignore these "in-app" site loads

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

      

Basically, I wondered if this was a reliable way of doing this test, and what should we look for to detect similar issues on Android / Windows / other phones running QRafter equivalents? What will their User Agent strings be? Or maybe it's a problem with the QRafter app on iOS due to its "URL Test" feature?

Feel free (constructively if !!) to criticize our method of storing mobile / desktop site mode in a session object, but it might be a little late for us to refactor that in this project.

Apologies for the long winding up of this question, I hope this is still just a Q&A and thanks in advance for any helpful information.


Edit: As pointed out by Stephen below, in a nutshell, my question is essentially: "Is there a practical way to detect user agent strings sent directly from mobile devices (of any taste) along with those of their mobile browsers?"

eg. (for iOS / Safari connection) directly from the app

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

      

Safari user agent string

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

      

+3


source to share


2 answers


Basically, your problem summarizes as: you can USUALLY detect the browser, but sometimes you don't get the expected User Agent string and send the desktop version to the mobile device.

The problem with solving this problem is that you will need to modify the regex to detect every time this situation appears with a new program. While this could be done in a loop and a table in the database, it is still a lot of maintenance and hassle. Though, to be honest, it's the same with other solutions. Someone has to maintain a list of "mobile" browsers. It could be itself, or it could be a service you pay for.

What I will do is have JavaScript define the browser and its version on the desktop side ( How can you determine the browser version? ). If it finds that it displays itself on a mobile device, provide a link to take the user to the corresponding mobile page.



You can go one step further and even add this logic to the page if and only if the user agent is not on the list provided by the Detect Mobile Browsers site. Of course, this is probably a bit overkill.

Unfortunately, at some point you just have to say, “We gave us the best result to get someone to present the site correctly,” and be happy with the way it works. There's so much automatic detection out there that can be done this way, and programmers will happily try to break that logic just because they can.

+3


source


You can try to use something like 51degrees.mobi to detect the browser instead of toppling your own solution. There are so many combinations with different quirks that it is difficult to roll your own end-to-end solution.



+2


source







All Articles