What is mobile detect in JavaScript?

Forstå Mobile Detect i JavaScript: Fordele og Faldgruber

10/09/2024

Rating: 4.76 (4793 votes)

I en verden, hvor internettet tilgås fra et utal af enheder – fra de mindste smartphones til store tablets og stationære computere – er det afgørende for webudviklere at kunne tilpasse indholdet. At levere en optimal brugeroplevelse kræver ofte, at man ved, hvilken type enhed brugeren anvender. Det er her værktøjer som Mobile Detect i JavaScript kommer ind i billedet. Denne artikel vil udforske, hvad Mobile Detect er, hvordan det fungerer, dets anvendelsesmuligheder, og ikke mindst de vigtige advarsler og alternative metoder, du bør overveje.

Is there a way to detect an Android device?
There's no guaranteed way to detect it, since the user agent is the only thing you can go on. Check here for more info... whatsmyos.com @Alexander Lozada : On the accepted answer, they basically test if it's an iPhone, an iPod, an Android device or whatever to return true.

Mobile Detect for JavaScript er en løs port af det populære PHP-bibliotek Mobile-Detect. Dets primære formål er at hjælpe udviklere med at identificere enhedstypen ved at analysere den såkaldte brugeragent-streng (User-Agent-streng) fra browseren. Denne streng indeholder information om browseren, operativsystemet og enheden, som anmodningen kommer fra. Ved at matche mønstre mod denne streng kan Mobile Detect give et indblik i enhedens karakteristika.

Indholdsfortegnelse

Hvad kan Mobile Detect i JavaScript registrere?

Biblioteket er designet til at give dig et hurtigt overblik over den enhed, der tilgår din webside. Her er en liste over de mest almindelige informationer, det kan udlede:

  • Om enheden er mobil eller ej.
  • Hvis den er mobil, om det er en telefon eller en tablet.
  • Hvilket operativsystem enheden kører (f.eks. Android, iOS).
  • Specifikke versionsnumre for browsermotorer (f.eks. WebKit).
  • Mobile Grade (A, B, C) – Bemærk dog, at denne funktion er fuldstændig forældet. Alle moderne enheder vil returnere 'A', hvilket gør den stort set ubrugelig i dag.

Den nuværende master branch af Mobile Detect i JavaScript benytter detektionslogikken fra Mobile-Detect version 2.8.37, hvilket betyder, at den bygger på en velafprøvet (omend ikke altid fuldstændigt opdateret) sæt af regler for identifikation.

Hvordan bruges Mobile Detect i praksis?

At komme i gang med Mobile Detect er relativt ligetil, uanset om du arbejder i en browser eller med Node.js på serversiden. Grundprincippet er at oprette en ny instans af MobileDetect-objektet ved at videregive brugeragentstrengen.

I browseren:

For at bruge Mobile Detect direkte i din klientside JavaScript skal du inkludere biblioteket og derefter initialisere det med window.navigator.userAgent, som er den standardmåde, browseren eksponerer sin brugeragentstreng på:

<script src="mobile-detect.js"></script>
<script>
var md = new MobileDetect(window.navigator.userAgent);
// Brug md-objektet her
</script>

I Node.js / Express:

På serversiden, for eksempel i en Node.js-applikation med Express, tilgår du brugeragentstrengen fra anmodningens headers:

var MobileDetect = require('mobile-detect'),
md = new MobileDetect(req.headers['user-agent']);
// Brug md-objektet her

Almindelige metoder og eksempler:

Når du har oprettet en instans af MobileDetect, kan du bruge en række metoder til at forespørge om enhedens egenskaber. Her er nogle eksempler:

var md = new MobileDetect('Mozilla/5.0 (Linux; U; Android 4.0.3; en-in; SonyEricssonMT11i' +
' Build/4.1.A.0.562) AppleWebKit/534.30 (KHTML, like Gecko)' +
' Version/4.0 Mobile Safari/534.30');

console.log(md.mobile()); // 'Sony'
console.log(md.phone()); // 'Sony'
console.log(md.tablet()); // null
console.log(md.userAgent()); // 'Safari'
console.log(md.os()); // 'AndroidOS'
console.log(md.is('iPhone'));// false
console.log(md.is('bot')); // false
console.log(md.version('Webkit')); // 534.3
console.log(md.versionStr('Build'));// '4.1.A.0.562'
console.log(md.match('playstation|xbox')); // false

Som du kan se, kan du nemt kontrollere, om en enhed er en mobiltelefon, en tablet, hvilket operativsystem den kører, og endda specifikke versioner af browsermotorer eller matche mod brugerdefinerede mønstre.

Den Vigtige Advarsel: Hvorfor User-Agent-baseret detektion er problematisk

Selvom Mobile Detect kan virke som en nem løsning, er det absolut afgørende at forstå de iboende begrænsninger og risici ved brugeragent-baseret detektion. Kilden til Mobile Detect.js advarer selv kraftigt mod at stole udelukkende på denne metode i de fleste tilfælde, og denne advarsel bør tages meget alvorligt.

Hvorfor er det upålideligt?

  • Konstant forældede regler: Verden af mobile enheder og browsere udvikler sig i et rasende tempo. Nye enheder, nye operativsystemversioner og nye browsere udkommer hele tiden. Reglerne (regulære udtryk) i Mobile Detect skal konstant opdateres for at følge med, og de vil altid være ufuldstændige.
  • Behov for løbende opdateringer: For at sikre, at din detektionskode forbliver relevant, skal du løbende opdatere biblioteket. Hvis du ikke gør det, risikerer du, at nye enheder ikke genkendes korrekt, eller at de genkendes forkert.
  • Brugeragent-strenge kan forfalskes: Både brugeragent-strenge og navigator.platform-strenge kan nemt ændres af brugere eller via browserudvidelser. Dette gøres ofte, fordi websites bruger for aggressive detektionsmetoder, der fejlagtigt deaktiverer funktioner, som brugerens browser faktisk understøtter. Det skaber en konflikt, hvor brugerne føler sig tvunget til at forfalske deres identitet for at få adgang til fuld funktionalitet.
  • Mindre pålidelig på serversiden: Selvom biblioteket kan bruges med Node.js, er det generelt mindre pålideligt at bruge det på serversiden, da det er baseret på information, der kan manipuleres af klienten.

Som en generel tommelfingerregel bør du ikke inkludere dette bibliotek direkte i din HTML-side og bør altid indkapsle dets brug i din egen kode. Dette giver dig mulighed for at tilpasse adfærden eller implementere yderligere validering, hvis resultatet fra Mobile Detect ikke er tilfredsstillende.

Bedre Alternativer til Enhedsdetektion

I stedet for at stole på den usikre brugeragent-sniffing, anbefales det kraftigt at overveje alternative og mere robuste metoder til at tilpasse din webapplikation:

1. Funktionsdetektion (Feature Detection)

Denne tilgang handler om at kontrollere, om browseren understøtter en specifik funktion, som din webapplikation har brug for, i stedet for at gætte på enhedstypen. Hvis din applikation f.eks. kræver berøringsinput, skal du kontrollere for berøringsstøtte (f.eks. 'ontouchend' in document) i stedet for at spørge, om det er en tablet eller telefon. Biblioteker som Modernizr er specielt designet til dette formål og kan tilføje CSS-klasser eller JavaScript-variabler baseret på understøttede funktioner.

2. Medieforespørgsler (Media Queries)

Medieforespørgsler er en del af CSS og giver dig mulighed for at anvende forskellige stilarter baseret på enhedens egenskaber såsom skærmbredde, højde, opløsning og orientering. Dette er grundlaget for responsivt webdesign og er en yderst effektiv måde at tilpasse layout og design på uden at skulle identificere en specifik enhed. Eksempler kan findes på mediaqueri.es. Dette er den foretrukne metode til at håndtere layouttilpasning.

Does Internet Explorer detect iOS devices?
Internet Explorer on this device contains a message '...like iPhone OS...' in the user agent string and thus will return true on this test. After iOS 13 you should detect iOS devices like this, since iPad will not be detected as iOS devices by old ways (due to new "desktop" options, enabled by default):

Ved at fokusere på, hvad browseren kan, i stedet for hvad den er, skaber du en mere fremtidssikret og robust løsning, der vil fungere, selv når nye enheder og browsere dukker op.

Installation og Fodaftryk

Hvis du stadig vælger at bruge Mobile Detect, er installationen ligetil via populære pakkehåndteringer eller CDN'er:

  • NPM:npm install mobile-detect --save
  • CDN:
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/mobile-detect.min.js"></script>
    eller
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mobile-detect/1.4.5/mobile-detect.min.js"></script>

Med hensyn til filstørrelse er biblioteket relativt letvægtigt, især i sin minificerede og gzippede form:

  • Udvikling: 70168 bytes
  • Minificeret: 39585 bytes
  • Minificeret + gzipped: 16556 bytes

Udvidelse og Tilpasning af Mobile Detect

Selvom det ikke anbefales at stole på interne metoder eller strukturer i Mobile Detect, er det muligt at ændre dets adfærd ved at erstatte specifikke interne metoder med dine egne implementeringer. Dette kaldes også "monkey-patching". Hvis du finder dette nødvendigt, anbefales det at dykke ned i kildekoden og testfilerne (f.eks. tests/spec/MobileDetectSpec.js) for at se eksempler på "Extensibility". Dette kan være nyttigt, hvis du har meget specifikke detektionsbehov, der ikke dækkes af standardfunktionaliteten.

Specifikke Detektionsscenarier: Android og iOS

Mobile Detect kan være nyttigt i scenarier, hvor du ønsker at differentiere mellem specifikke operativsystemer, f.eks. for at dirigere brugere til den korrekte app-download.

Hvordan man detekterer Android-enheder:

Du kan nemt finde ud af, om en enhed kører Android, ved at bruge md.os() metoden, som vil returnere 'AndroidOS' for Android-enheder:

var md = new MobileDetect(window.navigator.userAgent);
if (md.os() === 'AndroidOS') {
console.log('Dette er en Android-enhed!');
} else {
console.log('Ikke Android.');
}

Du kan også kombinere dette med md.mobile() eller md.tablet() for at differentiere yderligere mellem Android-telefoner og -tablets.

Hvordan man detekterer iOS-enheder og versioner:

Detektion af iOS-enheder er blevet mere kompleks, især efter introduktionen af iOS 13 på iPad, hvor brugeragent-strengen for iPad blev ændret til at ligne den fra macOS. Dette gør traditionel brugeragent-sniffing mindre pålidelig for iPad.

Traditionel (men nu mangelfuld for iOS 13+ iPad) iOS-detektion:

Før iOS 13 kunne man ofte stole på en simpel brugeragent-test:

var iOS = !window.MSStream && /iPad|iPhone|iPod/.test(navigator.userAgent); // Fejler på iPad iOS 13

!window.MSStream er inkluderet for at undgå fejlagtig detektion af Internet Explorer 11.

Den anbefalede metode til iOS 13+ (inkl. iPad):

For at detektere iOS 13 iPads (og dermed skelne dem fra macOS-enheder) er det nødvendigt at kigge på navigator.platform og tjekke for berøringsinput. Denne metode er mere robust:

function iOS() {
return [
'iPad Simulator',
'iPhone Simulator',
'iPod Simulator',
'iPad',
'iPhone',
'iPod'
].includes(navigator.platform)
// iPad på iOS 13 detektion
|| (navigator.userAgent.includes("Mac") && "ontouchend" in document)
}

var erIOS = iOS(); // true eller false

Her tjekker vi først for traditionelle iOS-platformstrenge og derefter, om brugeragenten indeholder "Mac" samtidig med at enheden understøtter berøringsinput (ontouchend in document). Dette er en stærk indikator for en iPad, da Mac-computere normalt ikke har berøringsinput i browseren (medmindre det er en Mac med touchskærm, hvilket er sjældent).

Advarsel om forfalskning (igen):

Det er vigtigt at gentage: Både navigator.userAgent og navigator.platform kan forfalskes af brugeren eller via browserudvidelser. Hvis din applikation har kritiske funktioner, der afhænger af enhedstype, er funktionsdetektion altid den sikreste vej.

Detektion af iOS-version:

Den mest almindelige måde at detektere iOS-versionen på er ved at parse den fra brugeragent-strengen. Dog er dette også upålideligt og kan bryde, hvis Apple ændrer formatet. En mere robust (men stadig ikke perfekt) metode er funktionsdetektion-inferens. Vi ved f.eks., at History API blev introduceret i iOS 4, matchMedia API i iOS 5, WebAudio API i iOS 6 osv. Ved at tjekke for tilstedeværelsen af disse API'er kan du indirekte slutte dig til iOS-versionen. Dette er dog en sårbar metode, da funktioner kan blive afskrevet eller ændret i fremtiden.

What is mobile detect in JavaScript?
Mobile-Detect A lightweight PHP class for detecting mobile devices (including tablets). This is the "source" of this JavaScript project and if you use PHP on your server you should use it!

Ofte Stillede Spørgsmål (FAQ)

Er Mobile Detect altid den bedste løsning til at identificere enheder?

Nej, absolut ikke. Selvom det er nemt at implementere, er brugeragent-baseret detektion generelt upålidelig og bør kun bruges, når mere robuste metoder som funktionsdetektion og medieforespørgsler ikke er tilstrækkelige, eller når du har en høj tolerance for unøjagtighed. Det er bedst til hurtige, ikke-kritiske detektioner.

Kan jeg bruge Mobile Detect til at vælge den korrekte app-version til download?

Ja, det kan du. Men du skal være opmærksom på de samme begrænsninger ved brugeragent-sniffing. Hvis en bruger f.eks. forfalsker sin brugeragent-streng, kan de blive sendt til den forkerte downloadside. For kritiske applikationer kan det være bedre at præsentere begge downloadmuligheder (iOS og Android) og lade brugeren vælge, eller at bruge en kombination af detektion og brugerbekræftelse.

Hvad er "Mobile Grade" funktionen, og er den stadig relevant?

"Mobile Grade" er en forældet funktion, der tidligere forsøgte at kategorisere enheder i A, B eller C baseret på deres formodede funktionssæt. I dag vil stort set alle moderne enheder returnere 'A', hvilket gør funktionen irrelevant og ubrugelig for nutidens webudvikling.

Er User-Agent-strenge pålidelige for alle detektionsbehov?

Nej. Brugeragent-strenge er notorisk upålidelige. De er ofte ufuldstændige, forældede og kan let forfalskes af brugeren. For kritiske funktionaliteter eller tilpasningsevne, der kræver høj præcision, er funktionsdetektion og medieforespørgsler langt mere pålidelige metoder.

Hvordan kan jeg bidrage til Mobile Detect-projektet?

Hvis du ønsker at bidrage med understøttelse af nye enheder, anbefales det at bidrage direkte til den originale Mobile-Detect (PHP) repository, da Mobile Detect i JavaScript er en port af denne. For JavaScript-specifikke forbedringer eller fejlrettelser kan du bidrage til hgoebl/mobile-detect.js-projektet på GitHub.

Konklusion

Mobile Detect i JavaScript tilbyder en hurtig og nem måde at få et indblik i en brugers enhedstype ved at analysere brugeragent-strengen. Det kan være nyttigt til simple, ikke-kritiske tilpasninger eller til at indsamle grov statistik over besøgende enheder. Dens enkelhed i brug er dens største styrke.

Men det er absolut afgørende at huske på de alvorlige advarsler, der følger med brugeragent-baseret detektion. Dens upålidelighed, på grund af konstante ændringer i enhedslandskabet og muligheden for manipulation, gør den uegnet til kritiske applikationer, der kræver høj præcision og robusthed.

For en fremtidssikret og pålidelig webapplikation bør du altid prioritere funktionsdetektion (med værktøjer som Modernizr) og medieforespørgsler. Disse metoder fokuserer på, hvad browseren faktisk kan, frem for at gætte på enhedens identitet, hvilket resulterer i en mere stabil og brugervenlig oplevelse på tværs af alle enheder. Brug Mobile Detect med omtanke og kun der, hvor dets begrænsninger er acceptable.

Hvis du vil læse andre artikler, der ligner Forstå Mobile Detect i JavaScript: Fordele og Faldgruber, kan du besøge kategorien Teknologi.

Go up