ตรวจจับเบราว์เซอร์มือถือโดยอัตโนมัติ (ผ่าน user-agent?) [ปิด]


291

ฉันจะตรวจสอบได้อย่างไรว่าผู้ใช้กำลังดูเว็บไซต์ของฉันจากเว็บเบราว์เซอร์มือถือเพื่อที่ฉันจะสามารถตรวจจับและแสดงเว็บไซต์ในรุ่นที่เหมาะสมได้โดยอัตโนมัติ


12
iPad นับได้ไหม? :)
Seva Alekseyev

33
ความคิดเห็นของ Seva ก่อให้เกิดคำถามที่ดี วันนี้ "มือถือ" หมายถึงอะไรจริงๆ? มันอ้างถึง "ฟีเจอร์โฟน" ที่มีเบราว์เซอร์ แต่มีไม่มากใช่หรือไม่ มันอ้างถึงสมาร์ทโฟนที่มีคุณสมบัติครบถ้วนซึ่งวิธีการป้อนข้อมูลและความละเอียดการแสดงผลนั้น จำกัด ปัจจัยหรือไม่? แท็บเล็ตที่ใช้งานง่ายและมีหน้าจอความละเอียดสูงเป็นอย่างไร วิธีการเกี่ยวกับอุปกรณ์เช่นศูนย์สื่อ - พวกเขาไม่เคยออกจากห้องนั่งเล่น แต่มีข้อ จำกัด ที่คล้ายกัน เพื่อนในที่ทำงานส่งสิ่งนี้ให้ฉัน ฉันพบว่ามันลึกซึ้งมาก slideshare.net/bryanrieger/rethinking-the-mobile-web-by-yiibu
spaaarky21

1
@Ricki แต่บน ipad คุณยังไม่สามารถทำได้เช่นแสดงเนื้อหาแฟลชหรือใช้โปรแกรมแก้ไขข้อความที่ใช้จาวาสคริปต์เช่น tinymce
TJ Ellis

1
ipad ไม่สามารถดูแฟลชได้ แต่เป็นหัวข้ออื่นเช่นตรวจสอบว่าเบราว์เซอร์รองรับแฟลชหรือไม่
Shaun

2
เพียงโพสต์จากอนาคต แต่ทุกคนที่สนใจในการให้บริการรุ่นมือถือของเว็บไซต์ของพวกเขาอาจสนใจในบางบทความเกี่ยวกับ "การออกแบบที่ตอบสนอง"
Vael Victus

คำตอบ:


91

ใช่การอ่านส่วนหัวของ User-Agent นั้นจะเป็นการหลอกลวง

มีรายการ บางส่วนจากตัวแทนผู้ใช้มือถือที่รู้จักดังนั้นคุณไม่จำเป็นต้องเริ่มจากศูนย์ สิ่งที่ฉันทำเมื่อฉันต้องทำคือการสร้างฐานข้อมูลของตัวแทนผู้ใช้ที่รู้จักและเก็บข้อมูลที่ไม่รู้จักเนื่องจากพวกเขาถูกตรวจพบเพื่อการแก้ไขและจากนั้นคิดด้วยตนเองว่าเป็นอะไร สิ่งสุดท้ายนี้อาจ overkill ในบางกรณี

หากคุณต้องการที่จะทำในระดับ Apache คุณสามารถสร้างสคริปต์ที่สร้างชุดของกฎการเขียนซ้ำการตรวจสอบตัวแทนผู้ใช้ (หรือเพียงแค่ครั้งเดียวและลืมเกี่ยวกับตัวแทนผู้ใช้ใหม่หรือเดือนละครั้งสิ่งที่เหมาะกับกรณีของคุณ) เช่น

RewriteEngine On

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

ซึ่งจะย้ายตัวอย่างเช่นคำขอไปยังhttp: //domain/index.htmlไปที่ http: //domain/mobile/index.html

หากคุณไม่ชอบวิธีการสร้างสคริปต์สร้างไฟล์ htaccess เป็นระยะคุณสามารถเขียนโมดูลที่ตรวจสอบตัวแทนผู้ใช้ (ฉันไม่พบที่ทำไว้แล้ว แต่พบตัวอย่างที่เหมาะสมโดยเฉพาะ) และรับตัวแทนผู้ใช้ จากบางไซต์เพื่ออัปเดต จากนั้นคุณสามารถสร้างความซับซ้อนให้มากที่สุดเท่าที่คุณต้องการ แต่ฉันคิดว่าในกรณีของคุณวิธีการก่อนหน้านี้น่าจะดี


3
สามารถทำได้ที่เว็บเซิร์ฟเวอร์เลเยอร์ (Apache) ผ่านคำสั่ง. htaccess บางประเภทแทนที่จะใช้ภาษาสคริปต์เช่น PHP?

ความคิดใด ๆ ไปยังรากเอกสารชุดโดยใช้ตัวแทน
คาร์สัน

126

มีสคริปต์โอเพนซอร์สในDetect Mobile Browserที่ทำเช่นนี้ใน Apache, ASP, ColdFusion, JavaScript และ PHP


5
@ กีต้าร์หากเป็นกรณีนี้คุณควรส่ง UA ของคุณ
Adam Tuttle

9
Bleh ... ฉันไม่ชอบ "กลิ่นรหัส" ของโซลูชันเหล่านี้จริงๆ การจับคู่ Regex ใช้คำนำหน้าจำนวน 4 อักขระโดยไม่มีเงื่อนงำเกี่ยวกับที่มาของมันมาจากไหน ... ไม่เป็นไรขอบคุณ
พวกเราทุกคนโมนิก้า

2
นั่นคือหนึ่งคำสั่ง regex อย่างกล้าหาญ ฉันเห็นด้วยรหัสกลิ่นไม่ดีในนี้
Jack Cox

5
ฉันไม่ชอบโซลูชัน "โอเพ่นซอร์ส" ที่ไม่มีใบอนุญาตและไม่มีข้อบ่งชี้ของการปรับปรุง
Eduardo

12
แม้ว่าจะไม่มีวิธีแก้ไขก็ตาม ในบางระดับวิธีการแก้ปัญหาใด ๆ จะทำการตรวจสอบ regex ในตัวแทนผู้ใช้
Kyle

33

แค่คิด แต่จะทำอย่างไรถ้าคุณแก้ไขปัญหานี้จากทิศทางตรงกันข้าม แทนที่จะพิจารณาว่าเบราว์เซอร์ใดเป็นอุปกรณ์เคลื่อนที่ทำไมถึงไม่ตัดสินว่าเบราว์เซอร์ใดไม่ใช่ จากนั้นให้รหัสไซต์ของคุณเป็นค่าเริ่มต้นเป็นเวอร์ชันมือถือและเปลี่ยนเส้นทางไปเป็นเวอร์ชันมาตรฐาน มีความเป็นไปได้สองอย่างพื้นฐานเมื่อดูที่เบราว์เซอร์มือถือ อาจรองรับ javascript หรือไม่ก็ได้ ดังนั้นหากเบราว์เซอร์ไม่มีการสนับสนุนจาวาสคริปต์ก็จะเริ่มต้นเป็นรุ่นมือถือ หากรองรับ JavaScript ให้ตรวจสอบขนาดหน้าจอ อะไรก็ตามที่มีขนาดเล็กกว่าจะเป็นเบราว์เซอร์มือถือ อะไรที่ใหญ่กว่านั้นจะถูกนำไปยังเค้าโครงมาตรฐานของคุณ จากนั้นสิ่งที่คุณต้องทำคือตรวจสอบว่าผู้ใช้ที่ปิดใช้งาน JavaScript นั้นเป็นมือถือหรือไม่
ตาม W3C จำนวนผู้ใช้ที่ปิดการใช้งาน JavaScript อยู่ที่ประมาณ 5% และผู้ใช้ส่วนใหญ่ปิดใช้งานซึ่งหมายความว่าพวกเขารู้ว่าพวกเขากำลังทำอะไรกับเบราว์เซอร์จริง พวกเขาเป็นส่วนใหญ่ของผู้ชมของคุณ? ถ้าไม่ก็ไม่ต้องกังวลกับพวกเขา ถ้าเป็นเช่นนั้นสถานการณ์กรณีที่เลวร้ายที่สุดคืออะไร? คุณมีผู้ใช้ที่เรียกดูเว็บไซต์เวอร์ชันมือถือของคุณและนั่นเป็นสิ่งที่ดี


3
นี่เป็นความคิดที่ดีมากฉันคิดว่ามันเป็นทางออกที่สง่างาม
Maxim Veksler

3
+1 นี่ฟังดูแล้วน่ารักดี แต่สิ่งนี้จะส่งผลต่อซอฟต์แวร์รวบรวมข้อมูลของเครื่องมือค้นหาหรือไม่
Mikey G

นี่เป็นความคิดที่เข้าใจผิด ส่วนขยายเบราว์เซอร์ที่ปิดใช้งานจาวาสคริปต์นั้นได้รับความนิยมอย่างมากในเบราว์เซอร์เดสก์ท็อปดังนั้นหากไม่มีจาวาสคริปต์หมายความว่ามือถือนั้นผิดปกติ ความละเอียดของหน้าต่าง / วิวพอร์ต / หน้าจอไม่มีอะไรเกี่ยวข้องกับขนาดของเบราว์เซอร์และสมมติว่าความละเอียดต่ำระบุว่าขนาดมือถือจะทำให้แอปพลิเคชันเว็บของคุณน่าเกลียดและน่าผิดหวังสำหรับผู้ใช้หลายคน (ตัวอย่างเช่น: เบราว์เซอร์เดสก์ท็อปในหน้าต่างที่ไม่ใช่แบบเต็มหน้าจอ, แท็บเล็ตขนาดใหญ่)
ɈsәɹoɈ

31

นี่คือวิธีที่ฉันทำใน JavaScript:

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

ดูตัวอย่างได้ที่www.tablemaker.net/test/mobile.htmlซึ่งมีขนาดตัวอักษรสามเท่าบนโทรศัพท์มือถือ


ถ้าคุณต้องการที่จะรวมบัญชีของคุณดูที่นี่: meta.stackexchange.com/questions/18232/…
แบรนดอน

สิ่งนี้จะไม่ทำงานเมื่อมันมาถึงแท็บเล็ต (เช่น iPad)
Si8

ใช้ "mobi" เนื่องจาก Opera Mobile
mgutt

1
และคุณต้องการ "Opera Mini" เนื่องจากเป็นหนึ่งในเบราว์เซอร์ที่หายากที่ไม่ได้ใช้ "mobi" ในตัวแทนผู้ใช้
mgutt

17

กลไกการตรวจสอบที่ชื่นชอบเบราว์เซอร์มือถือเป็นWURFL อัปเดตบ่อยครั้งและทำงานได้กับแพลตฟอร์มการเขียนโปรแกรม / ภาษาที่สำคัญทุกแห่ง


เป็นเรื่องที่ดี แต่คำสั่ง "ใช้ได้กับทุกแพลตฟอร์มการเขียนโปรแกรม / ภาษาหลัก" เป็นตัวหนาเล็กน้อย
Kyle

8
นอกจากนี้ยังไม่ฟรีอีกต่อไป
MarkJ

ตอนนี้ใช้ได้เฉพาะภายใต้ใบอนุญาต AGPL ที่น่ารำคาญเว้นแต่คุณจะซื้อ en.wikipedia.org/wiki/WURFL#License_update
MarkJ

17

คุณได้พิจารณาใช้คำสั่งสื่อ css3 หรือไม่ ในกรณีส่วนใหญ่คุณสามารถใช้สไตล์ css บางอย่างโดยเฉพาะสำหรับอุปกรณ์เป้าหมายโดยไม่ต้องสร้างรุ่นมือถือแยกต่างหากของไซต์

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

คุณสามารถตั้งค่าความกว้างเป็นสิ่งที่คุณต้องการ แต่ 1,025 จะจับมุมมองแนวนอนของ iPad

คุณจะต้องเพิ่มเมตาแท็กต่อไปนี้ในหัวของคุณ:

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

ลองดูบทความนี้ที่ HTML5 Rocks เพื่อเป็นตัวอย่างที่ดี


1
ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดที่จะไป สคริปต์ที่ดูที่สตริงตัวแทนผู้ใช้จะถูกกำหนดให้ล้าสมัย การดูหน้าจออสังหาริมทรัพย์ที่มีอยู่จะช่วยให้สามารถออกแบบที่ตอบสนองได้โดยไม่ต้องกังวลกับอุปกรณ์ใหม่ที่ไม่ถูกตรวจจับ
Adam Tuttle

1
ใช้งานได้กับการตรวจจับฝั่งไคลเอ็นต์เท่านั้น แต่ถ้าคุณต้องการให้ฝั่งเซิร์ฟเวอร์ของคุณทำงานแตกต่างกันไปสำหรับไคลเอนต์มือถือคุณจะต้องใช้เทคนิคอื่น
Igor Brejc

สิ่งนี้ล้มเหลวอย่างน่าสังเวชสำหรับเบราว์เซอร์เดสก์ท็อปที่ไม่ได้ทำงานแบบเต็มหน้าจอ หากคุณเลือกที่จะทำเช่นนั้นโปรดอย่าเสียพื้นที่หน้าจอด้วยแบบอักษรและระยะขอบมหาศาลหรือซ่อนฟังก์ชันการทำงาน / ข้อมูลสำคัญหลังเมนูแบบเลื่อนลง มันจะทำให้ไซต์ / แอปของคุณน่าเกลียดและทำให้ผู้ใช้บางคนผิดหวัง
ʇsәɹoɈ

13

สำหรับ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>

ฉันพบว่ามันมีประโยชน์มาก
bozdoz

คุณควรตรวจสอบเงื่อนไขอย่างแน่นอนซึ่งจะจัดการทั้งหมดนี้ให้คุณ! คุณสามารถเพิ่มการทดสอบที่กำหนดเองดึงพวกเขาผ่านการทดสอบวัตถุและมีการเรียกกลับ พวกเขายังได้รับการทดสอบ premade อีกด้วย: conditionizr.com/detects
Halcyon991

ขอบคุณโดยสิ้นเชิงสำหรับคำตอบที่เป็นประโยชน์ แม้ว่าฉันไม่พบ UA ที่ตรงกับ "windows \ sce" ใน db ของฉัน
nefski

1
สิ่งนี้ใช้ไม่ได้กับโทรศัพท์ windows
jwerre

ขอบคุณ แต่โทรศัพท์ของ Windows ไม่ได้ระบุ ...
Jorgesys

6

ไฟล์เบราว์เซอร์อุปกรณ์พกพาเป็นวิธีที่ยอดเยี่ยมในการตรวจจับ broswers มือถือ (และอื่น ๆ ) สำหรับโครงการ ASP.NET: http://mdbf.codeplex.com/


เบราว์เซอร์อุปกรณ์มือถือยังทำงานอยู่หรือไม่? ฉันสังเกตเห็นว่ามีข้อความเกี่ยวกับการออฟไลน์หรือไม่ ...
creativeedg10

5

คุณสามารถตรวจจับไคลเอนต์มือถือได้อย่างง่ายดาย navigator.userAgentและโหลดสคริปต์สำรองตามประเภทไคลเอ็นต์ที่ตรวจพบดังนี้:

 $(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
    }

    });

สำหรับโซลูชันที่จัดการได้มากกว่าคุณสามารถใช้ Conditionizr ซึ่งจะจัดการทั้งหมดนี้ให้คุณ! คุณสามารถเพิ่มการทดสอบที่กำหนดเองดึงพวกเขาผ่านการทดสอบวัตถุและมีการเรียกกลับ พวกเขายังได้รับการทดสอบ premade อีกด้วย: conditionizr.com/detects
Halcyon991

4

คุณสามารถตรวจสอบสตริงตัวแทนผู้ใช้ ในจาวาสคริปต์นั้นง่ายมากมันเป็นเพียงคุณสมบัติของวัตถุนำทาง

var useragent = navigator.userAgent;

คุณสามารถตรวจสอบว่าอุปกรณ์ถ้า iPhone หรือ Blackberry ใน JS กับสิ่งที่ชอบ

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

ถ้า isPhone เป็นจริงคุณกำลังเข้าใช้งานเว็บไซต์จาก Iphone หาก isBlackBerry คุณกำลังเข้าใช้งานเว็บไซต์จาก Blackberry

คุณสามารถใช้ปลั๊กอิน "UserAgent Switcher" สำหรับ firefox เพื่อทดสอบว่า

หากคุณสนใจก็อาจจะคุ้มค่าที่จะตรวจสอบสคริปต์"redirection_mobile.js"ของฉันที่โฮสต์บน github ที่นี่https://github.com/sebarmeli/JS-Redirection-Mobile-Siteและคุณสามารถอ่านรายละเอียดเพิ่มเติมได้จาก บทความของฉันที่นี่:

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


1
การใช้. match นั้นผิดที่นี่คุณต้องการใช้. test () ซึ่งประเมินค่าบูลีนมันยังเร็วกว่า. match () มากและจะไม่ส่งคืนอาร์เรย์ สำหรับโซลูชันที่จัดการได้มากขึ้นสำหรับการทดสอบผู้ใช้ของคุณคุณสามารถใช้ Conditionizr ซึ่งจะจัดการทั้งหมดนี้ให้คุณ! คุณสามารถเพิ่มการทดสอบที่กำหนดเองดึงพวกเขาผ่านการทดสอบวัตถุและมีการเรียกกลับ พวกเขายังมีการทดสอบ premade อีกด้วย: conditionizr.com/detects
Halcyon991

4
protected void Page_Load(object sender, EventArgs e)
{
    if (Request.Browser.IsMobileDevice == true)
    {
        Response.Redirect("Mobile//home.aspx");
    }
}

ตัวอย่างนี้ทำงานใน asp.net


3

คุณยังไม่ได้พูดภาษาที่คุณใช้ ถ้ามันเป็น Perl แล้วมันเป็นเรื่องเล็กน้อย:

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
}

ควรใช้โมดูลใด: neilb.org/reviews/user-agent.html
Jonas G. Drange

0

ใช่ตัวแทนผู้ใช้จะใช้ในการตรวจสอบเบราว์เซอร์มือถือ มีสคริปต์ฟรีมากมายให้ตรวจสอบเรื่องนี้ นี่คือรหัส phpหนึ่งรหัสซึ่งจะช่วยให้คุณเปลี่ยนเส้นทางผู้ใช้มือถือไปยังเว็บไซต์อื่น


1
สามารถทำได้ที่เว็บเซิร์ฟเวอร์เลเยอร์ (Apache) ผ่านคำสั่ง. htaccess บางประเภทแทนที่จะใช้ PHP?

0

ฉันวางตัวอย่างนี้พร้อมสคริปต์และตัวอย่างรวมไว้ด้วยกัน:

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

ตัวอย่างนี้ใช้ฟังก์ชัน php สำหรับการตรวจสอบตัวแทนผู้ใช้และมอบสิทธิประโยชน์เพิ่มเติมในการอนุญาตให้ผู้ใช้ระบุการตั้งค่าสำหรับรุ่นของไซต์ซึ่งโดยทั่วไปจะไม่เป็นค่าเริ่มต้นตามเบราว์เซอร์หรือประเภทอุปกรณ์ สิ่งนี้ทำได้กับคุกกี้ (ดูแลโดยใช้ php บนฝั่งเซิร์ฟเวอร์ซึ่งตรงข้ามกับจาวาสคริปต์)

อย่าลืมดูลิงค์ดาวน์โหลดในบทความเพื่อดูตัวอย่าง

หวังว่าคุณจะสนุก!


0

MobileESPมี PHP, Java, APS.NET (C #), Ruby และ JavaScript hooks มันมีสิทธิ์การใช้งาน Apache 2 ด้วยเช่นกันดังนั้นฟรีสำหรับใช้ในเชิงพาณิชย์ สิ่งสำคัญสำหรับฉันคือมันระบุเฉพาะเบราว์เซอร์และแพลตฟอร์มที่ไม่ใช่ขนาดหน้าจอและตัวชี้วัดอื่น ๆ ซึ่งทำให้มันมีขนาดเล็ก


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.