Mobiler Browser automatisch erkennen (über User-Agent?) [Geschlossen]

291

Wie kann ich feststellen, ob ein Benutzer meine Website über einen mobilen Webbrowser anzeigt, damit ich die entsprechende Version meiner Website automatisch erkennen und anzeigen kann?


quelle
12
Zählt das iPad? :)
Seva Alekseyev
33
Sevas Kommentar wirft eine gute Frage auf. Was bedeutet "mobil" heute wirklich? Bezieht es sich auf ein "Feature-Telefon", das einen Browser hat, aber nicht viel von einem? Bezieht es sich auf Smartphones mit vollem Funktionsumfang, bei denen die Eingabemethode und die Bildschirmauflösung einschränkende Faktoren sind? Wie wäre es mit Tablets, die sowohl einfach zu interagieren sind als auch über hochauflösende Displays verfügen? Wie wäre es mit Geräten wie Media Centern - sie verlassen nie das Wohnzimmer, haben aber ähnliche Einschränkungen. Ein Freund bei der Arbeit hat mir das geschickt. Ich fand es sehr aufschlussreich. slidehare.net/bryanrieger/rethinking-the-mobile-web-by-yiibu
spaaarky21
1
@ Ricki, aber auf dem iPad können Sie immer noch keinen Flash-Inhalt anzeigen oder einen Javascript-basierten Rich-Text-Editor wie tinymce verwenden.
TJ Ellis
1
Das iPad kann kein Flash anzeigen, aber das ist ein anderes Thema, z. B. festzustellen, ob der Browser Flash unterstützt.
Shaun
2
Nur ein Beitrag aus der Zukunft, aber jeder, der daran interessiert ist, eine mobile Version seiner Website bereitzustellen, könnte an einigen Artikeln zum Thema "Responsive Design" interessiert sein.
Vael Victus

Antworten:

91

Ja, das Lesen des User-Agent-Headers reicht aus.

Es gibt einige Listen heraus dort von bekannten mobilen User - Agents , so dass Sie brauchen nicht von Grund auf neu zu starten. Was ich getan habe, als ich musste, war, eine Datenbank bekannter Benutzeragenten zu erstellen und Unbekannte zu speichern, wenn diese zur Überarbeitung erkannt werden, und dann manuell herauszufinden, was sie sind. Diese letzte Sache könnte in einigen Fällen übertrieben sein.

Wenn Sie dies auf Apache-Ebene tun möchten, können Sie ein Skript erstellen, das regelmäßig eine Reihe von Umschreiberegeln generiert, die den Benutzeragenten überprüfen (oder nur einmal und neue Benutzeragenten vergessen oder einmal im Monat, je nachdem, was für Ihren Fall geeignet ist)

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} (OneMobileUserAgent|AnotherMobileUserAgent|...)
RewriteRule (.*) mobile/$1

Dies würde beispielsweise Anforderungen an http: //domain/index.html nach http: //domain/mobile/index.html verschieben

Wenn Sie den Ansatz nicht mögen, dass ein Skript eine htaccess-Datei regelmäßig neu erstellt, können Sie ein Modul schreiben, das den Benutzeragenten überprüft (ich habe keinen bereits erstellten gefunden, aber dieses besonders geeignete Beispiel gefunden ) und die Benutzeragenten abrufen von einigen Websites, um sie zu aktualisieren. Dann können Sie den Ansatz so komplizieren, wie Sie möchten, aber ich denke, in Ihrem Fall wäre der vorherige Ansatz in Ordnung.

Vinko Vrsalovic
quelle
3
Kann dies auf der Webserverebene (Apache) durch eine Art .htaccess-Befehl erreicht werden - anstatt eine Skriptsprache wie PHP zu verwenden?
jede Idee, Dokumentstamm durch Benutzer-Agent zu setzen
Carson
126

Es gibt Open Source-Skripte in Detect Mobile Browser , die dies in Apache, ASP, ColdFusion, JavaScript und PHP tun.

Chad Smith
quelle
5
@guitar Wenn dies der Fall ist, sollten Sie Ihre UA einschicken.
Adam Tuttle
9
Bleh ... Ich mag den "Code-Geruch" dieser Lösungen wirklich nicht. Regex-Matching mit einer Reihe von 4-stelligen Präfixen ohne Ahnung, woher sie ursprünglich stammten ... nein, danke.
Wir sind alle Monica
2
Das ist eine knifflige Regex-Aussage. Ich stimme zu, der Code-Geruch ist in diesem Fall nicht gut.
Jack Cox
5
Ich mag auch keine "Open Source" -Lösungen ohne Lizenz und ohne Hinweis auf Updates.
Eduardo
12
Daran führt kein Weg vorbei. Auf einer bestimmten Ebene wird jede Art von Lösung eine Regex-Prüfung des Benutzeragenten durchführen.
Kyle
33

Nur ein Gedanke, aber was wäre, wenn Sie dieses Problem aus der entgegengesetzten Richtung lösen würden? Anstatt zu bestimmen, welche Browser mobil sind, sollten Sie feststellen, welche Browser nicht mobil sind. Codieren Sie dann Ihre Site so, dass standardmäßig die mobile Version verwendet wird, und leiten Sie zur Standardversion um. Beim Betrachten eines mobilen Browsers gibt es zwei grundlegende Möglichkeiten. Entweder unterstützt es Javascript oder nicht. Wenn der Browser keine Javascript-Unterstützung bietet, wird standardmäßig die mobile Version verwendet. Wenn JavaScript unterstützt wird, überprüfen Sie die Bildschirmgröße. Alles, was unter einer bestimmten Größe liegt, ist wahrscheinlich auch ein mobiler Browser. Alles, was größer ist, wird zu Ihrem Standardlayout umgeleitet. Dann müssen Sie nur noch feststellen, ob der Benutzer mit deaktiviertem JavaScript mobil ist oder nicht.
Laut W3C betrug die Anzahl der Benutzer mit deaktiviertem JavaScript etwa 5%, und die meisten Benutzer haben es deaktiviert, was bedeutet, dass sie tatsächlich wissen, was sie mit einem Browser tun. Sind sie ein großer Teil Ihres Publikums? Wenn nicht, dann mach dir keine Sorgen um sie. Wenn ja, was ist der schlimmste Fall? Diese Benutzer durchsuchen die mobile Version Ihrer Website, und das ist gut so.

Midsever
quelle
3
Dies ist eine sehr gute Idee, ich denke, es ist eine elegante Lösung.
Maxim Veksler
3
+1 das klingt nach einer ziemlich süßen Idee, aber würde dies Suchmaschinen-Crawler betreffen?
Mikey G
Dies ist eine fehlgeleitete Idee. Browser-Erweiterungen, die Javascript deaktivieren, sind in Desktop-Browsern sehr beliebt. Wenn Sie also davon ausgehen, dass kein Javascript bedeutet, dass Mobilgeräte einfach falsch sind. Die Auflösung von Fenstern, Ansichtsfenstern und Bildschirmen hat nichts mit der Größe eines Browsers zu tun. Wenn Sie davon ausgehen, dass eine niedrige Auflösung die Größe eines Handhelds anzeigt, wird Ihre Web-App für viele Benutzer hässlich und frustrierend. (Zum Beispiel: Desktop-Browser in Nicht-Vollbild-Fenstern, große Tablets.)
21sәɹoɈ
31

So mache ich das in JavaScript:

function isMobile() {
  var index = navigator.appVersion.indexOf("Mobile");
  return (index > -1);
}

Ein Beispiel finden Sie unter www.tablemaker.net/test/mobile.html, wo die Schriftgröße auf Mobiltelefonen verdreifacht wird.

Ed Poor
quelle
Wenn Sie Ihre Konten zusammenführen möchten, finden Sie hier: meta.stackexchange.com/questions/18232/…
Brandon
Dies wird nicht funktionieren, wenn es um Tablet (zB iPad) geht
Si8
Verwenden Sie "mobi" wegen Opera Mobile.
mgutt
1
Und Sie benötigen "Opera Mini", da dies einer der seltenen Browser ist, die "mobi" im User Agent nicht verwenden.
mgutt
17

Mein bevorzugter Mechanismus zur Erkennung mobiler Browser ist WURFL . Es wird regelmäßig aktualisiert und funktioniert mit allen gängigen Programmier- / Sprachplattformen.

Pablo Santa Cruz
quelle
Es ist gut, aber die Aussage "funktioniert mit jeder wichtigen Programmier- / Sprachplattform" ist etwas kühn.
Kyle
8
Es ist auch nicht mehr kostenlos .
MarkJ
Es ist jetzt nur unter der lästigen AGPL-Lizenz verfügbar, es sei denn, Sie kaufen es. en.wikipedia.org/wiki/WURFL#License_update
MarkJ
17

Haben Sie darüber nachgedacht, CSS3-Medienabfragen zu verwenden? In den meisten Fällen können Sie einige CSS-Stile speziell für das Zielgerät anwenden, ohne eine separate mobile Version der Site erstellen zu müssen.

@media screen and (max-width:1025px) {
   #content {
     width: 100%;
   }
}

Sie können die Breite beliebig einstellen, aber 1025 fängt die iPad-Querformatansicht ab.

Sie möchten Ihrem Kopf auch das folgende Meta-Tag hinzufügen:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

In diesem Artikel bei HTML5 Rocks finden Sie einige gute Beispiele

Cory
quelle
1
Ich denke, das ist eigentlich der beste Weg. Skripte, die sich mit User Agent-Zeichenfolgen befassen, sind dazu bestimmt, nicht mehr aktuell zu sein. Das Betrachten der verfügbaren Bildschirmfläche ermöglicht ein reaktionsschnelles Design, ohne dass neue Geräte erkannt werden müssen.
Adam Tuttle
1
Dies funktioniert nur für die clientseitige Erkennung. Wenn Sie jedoch möchten, dass sich Ihre Serverseite für mobile Clients anders verhält, müssen Sie eine andere Technik verwenden.
Igor Brejc
Dies schlägt bei Desktop-Browsern, die nicht im Vollbildmodus ausgeführt werden, kläglich fehl. Wenn Sie sich trotzdem dafür entscheiden, verschwenden Sie bitte keinen Platz auf dem Bildschirm mit enormen Schriftarten und Rändern oder verstecken Sie wichtige Funktionen / Informationen hinter Dropdown-Menüs. Dadurch wird Ihre Website / App für einige Ihrer Benutzer hässlich und frustrierend.
21sәɹoɈ
13

für ANDROID, IPHONE, IPAD, BLACKBERRY, PALM, WINDOWS CE, PALM

 <script language="javascript"> <!--
     var mobile = (/iphone|ipad|ipod|android|blackberry|mini|windows\sce|palm/i.test(navigator.userAgent.toLowerCase()));
              if (mobile) {
                  alert("MOBILE DEVICE DETECTED");
                  document.write("<b>------------------------------------------<br>")
                  document.write("<b>" + navigator.userAgent + "<br>")
                  document.write("<b>------------------------------------------<br>")
                  var userAgent = navigator.userAgent.toLowerCase();
                  if ((userAgent.search("android") > -1) && (userAgent.search("mobile") > -1))
                         document.write("<b> ANDROID MOBILE <br>")
                   else if ((userAgent.search("android") > -1) && !(userAgent.search("mobile") > -1))
                       document.write("<b> ANDROID TABLET <br>")
                   else if ((userAgent.search("blackberry") > -1))
                       document.write("<b> BLACKBERRY DEVICE <br>")
                   else if ((userAgent.search("iphone") > -1))
                       document.write("<b> IPHONE DEVICE <br>")              
                   else if ((userAgent.search("ipod") > -1))
                       document.write("<b> IPOD DEVICE <br>")
               else if ((userAgent.search("ipad") > -1))
                       document.write("<b> IPAD DEVICE <br>")
                       else
                   document.write("<b> UNKNOWN DEVICE <br>")
              }
              else
                  alert("NO MOBILE DEVICE DETECTED"); //--> </script>
Jorgesys
quelle
Ich fand das sehr hilfreich.
Bozdoz
Sie sollten sich unbedingt Conditionizr ansehen, das all dies für Sie erledigt! Sie können benutzerdefinierte Tests hinzufügen, diese über Objekttests abrufen und Rückrufe durchführen. Sie haben auch eine Reihe von vorgefertigten Tests zur Verfügung: conditionizr.com/detects
Halcyon991
Elenasys, danke für die nützliche Antwort. Obwohl ich in meiner Datenbank keine UA finden kann, die mit "windows \ sce" übereinstimmt.
Nefski
1
Dies funktioniert nicht für Windows Phones.
Jwerre
Vielen Dank, aber Windows Phone wurde nicht angegeben ...
Jorgesys
6

Die Browserdatei für mobile Geräte ist eine hervorragende Möglichkeit, mobile (und andere) Browser für ASP.NET-Projekte zu erkennen: http://mdbf.codeplex.com/

mjf
quelle
Funktioniert der Browser für mobile Geräte noch? Ich
creativeedg10
5

Sie können mobile Clients einfach durch erkennen navigator.userAgentund alternative Skripts basierend auf dem erkannten Client-Typ wie folgt laden:

 $(document).ready(function(e) {

        if(navigator.userAgent.match(/Android/i)
          || navigator.userAgent.match(/webOS/i)
          || navigator.userAgent.match(/iPhone/i)
          || navigator.userAgent.match(/iPad/i)
          || navigator.userAgent.match(/iPod/i)
          || navigator.userAgent.match(/BlackBerry/i)
          || navigator.userAgent.match(/Windows Phone/i)) {

         //write code for your mobile clients here.

          var jsScript = document.createElement("script");
          jsScript.setAttribute("type", "text/javascript");
          jsScript.setAttribute("src", "js/alternate_js_file.js");
          document.getElementsByTagName("head")[0].appendChild(jsScript );

          var cssScript = document.createElement("link");
          cssScript.setAttribute("rel", "stylesheet");
          cssScript.setAttribute("type", "text/css");
          cssScript.setAttribute("href", "css/alternate_css_file.css");
          document.getElementsByTagName("head")[0].appendChild(cssScript); 

    }
    else{
         // write code for your desktop clients here
    }

    });
sohel khalifa
quelle
Für eine übersichtlichere Lösung können Sie Conditionizr verwenden, das all dies für Sie erledigt! Sie können benutzerdefinierte Tests hinzufügen, diese über Objekttests abrufen und Rückrufe durchführen. Sie haben auch eine Reihe von vorgefertigten Tests zur Verfügung: conditionizr.com/detects
Halcyon991
4

Sie können die User-Agent-Zeichenfolge überprüfen. In JavaScript ist das wirklich einfach, es ist nur eine Eigenschaft des Navigatorobjekts.

var useragent = navigator.userAgent;

Sie können überprüfen, ob das Gerät iPhone oder Blackberry in JS mit so etwas

var isIphone = !!agent.match(/iPhone/i),
    isBlackberry = !!agent.match(/blackberry/i);

Wenn isIphone wahr ist, greifen Sie von einem Iphone auf die Site zu. Wenn isBlackBerry, greifen Sie von einem Blackberry auf die Site zu.

Sie können das Plugin "UserAgent Switcher" für Firefox verwenden, um dies zu testen.

Wenn Sie auch interessiert sind, kann es sich lohnen, mein auf github gehostetes Skript "redirection_mobile.js" hier https://github.com/sebarmeli/JS-Redirection-Mobile-Site zu lesen, und Sie können weitere Details in einer von lesen Mein Artikel hier:

http://blog.sebarmeli.com/2010/11/02/how-to-redirect-your-site-to-a-mobile-version-through-javascript/

sebarmeli
quelle
1
Die Verwendung von .match ist hier falsch. Sie möchten .test () verwenden, das einen booleschen Wert ergibt. Es ist auch viel schneller als .match () und gibt kein Array zurück. Für eine übersichtlichere Lösung für Ihre userAgent-Tests können Sie Conditionizr verwenden, das all dies für Sie erledigt! Sie können benutzerdefinierte Tests hinzufügen, diese über Objekttests abrufen und Rückrufe durchführen. Sie haben auch eine Reihe von vorgefertigten Tests zur Verfügung: conditionizr.com/detects
Halcyon991
4
protected void Page_Load(object sender, EventArgs e)
{
    if (Request.Browser.IsMobileDevice == true)
    {
        Response.Redirect("Mobile//home.aspx");
    }
}

Dieses Beispiel funktioniert in asp.net

shiv
quelle
3

Sie haben nicht gesagt, welche Sprache Sie verwenden. Wenn es Perl ist, dann ist es trivial:

use CGI::Info;

my $info = CGI::Info->new();

if($info->is_mobile()) {
   # Add mobile stuff
}

unless($info->is_mobile()) {
   # Don't do some things on a mobile
}
Nigel Horne
quelle
Welches Modul zu verwenden: neilb.org/reviews/user-agent.html
Jonas G. Drange
0

Ja, User-Agent wird verwendet, um mobile Browser zu erkennen. Es gibt viele kostenlose Skripte, um dies zu überprüfen. Hier ist ein solcher PHP-Code, mit dem Sie mobile Benutzer auf eine andere Website umleiten können.

Shoban
quelle
1
Kann dies auf der Webserverebene (Apache) durch eine Art .htaccess-Befehl erreicht werden - anstatt PHP zu verwenden?
0

Ich habe diese Demo mit Skripten und Beispielen zusammengestellt:

http://www.mlynn.org/2010/06/mobile-device-detection-and-redirection-with-php/

Dieses Beispiel verwendet PHP-Funktionen zur Erkennung von Benutzeragenten und bietet den zusätzlichen Vorteil, dass Benutzer eine Präferenz für eine Version der Site angeben können, die aufgrund ihres Browsers oder Gerätetyps normalerweise nicht die Standardeinstellung ist. Dies geschieht mit Cookies (die im Gegensatz zu Javascript auf der Serverseite mit PHP verwaltet werden).

Schauen Sie sich unbedingt den Download-Link im Artikel an, um Beispiele zu finden.

Ich hoffe dir gefällt es!

Michael Lynn
quelle
0

MobileESP verfügt über PHP-, Java-, APS.NET- (C #), Ruby- und JavaScript-Hooks. Es hat auch die Apache 2-Lizenz, die für die kommerzielle Nutzung kostenlos ist. Das Wichtigste für mich ist, dass es nur Browser und Plattformen identifiziert, nicht Bildschirmgrößen und andere Metriken, was es schön klein hält.

rauben
quelle