Navigace

Hlavnφ menu

 

Identifikace prohlφ₧eΦ∙ v mobilnφch telefonech

P°i tvorb∞ strßnek se sna₧φm odd∞lovat vzhled od obsahu tφm, ₧e pou₧φvßm XHTML a CSS. Nedßvno jsem ale narazil na jeden problΘm. Vytvß°el jsem strßnku, ve kterΘ jsem navigaΦnφ nabφdku umis¥oval absolutnφm pozicovßnφm do levΘho sloupce. Nic by na tom nebylo, kdybych se na strßnku nepodφval mobilnφm telefonem. Zjistil jsem, ₧e navigaΦnφ menu nikde nenφ.

Testovßnφm jsem dosp∞l k zßv∞ru, ₧e m∙j mobilnφ telefon sice podporuje n∞kterΘ vlastnosti CSS, ale ne vÜechny a asi ne ·pln∞ sprßvn∞. P°ivedlo m∞ to tedy na myÜlenku, ₧e kdybych pro mobilnφ telefony odstranil definici CSS, strßnky by se zobrazovaly sprßvn∞. Zkusil jsem to ud∞lat ruΦn∞ a bylo to skuteΦn∞ tak.

Jen₧e jsem narazil na problΘm, jak programov∞ zjistit, ₧e se na strßnky dφvß n∞kdo z mobilnφho telefonu. Napadlo m∞, ₧e by se dal mobilnφ prohlφ₧eΦ (prohlφ₧eΦ v mobilnφm telefonu) rozpoznat podle v²skytu urΦitΘho °et∞zce v identifikaci prohlφ₧eΦe. Ka₧d² prohlφ₧eΦ se toti₧ strßnce identifikuje urΦit²m °et∞zcem, kter² obsahuje r∙znΘ informace o typu prohlφ₧eΦe. Tato identifikace se naÜt∞stφ dß zjistit jednoduch²m skriptem.

Ukßzka skriptu pro PHP:

<?php echo $_SERVER["HTTP_USER_AGENT"]; ?>

Ukßzka skriptu pro ASP:

<% Response.Write Request.ServerVariables("HTTP_USER_AGENT") %>

Te∩ u₧ jen zb²valo zφskat dostateΦn∞ velk² vzorek identifikacφ r∙zn²ch druh∙ prohlφ₧eΦ∙ (hlavn∞ t∞ch mobilnφch) a sestavit n∞jak² °φdφcφ °et∞zec, podle kterΘho by se daly identifikovat mobilnφ prohlφ₧eΦe.

Poda°ilo se mi na internetu najφt seznam, kter² obsahoval vφce ne₧ p∞t tisφc r∙zn²ch identifikacφ prohlφ₧eΦ∙, p°evß₧n∞ z mobilnφch telefon∙, a na zßklad∞ tohoto seznamu jsem sestavil °φdφcφ °et∞zec a naprogramoval funkci, kterß podle test∙ dokß₧e na 98,2 % identifikovat prohlφ₧eΦ z mobilnφho telefonu. Funkci jsem nazval IsMobile a jejφ k≤d m∙₧ete vid∞t nφ₧e.

Funkce IsMobile pro PHP:

<?php
function IsMobile()
{
  // funkcφ ERegI zjistφm v²skyt n∞kterΘ Φßsti °φdφcφho °et∞zce
  // v °et∞zci identifikace prohlφ₧eΦe
  $ret = ERegI(QuoteMeta("UP.LINK|MIDP|UP.BROWSER|NOKIA|MOT|SEC-".
  "|WAP|ERICSSON|SAMSUNG|SIE-|PHONE|PANASONIC".
  "|MITSU|LG|PORTALMMM|BLACKBERRY|SYMBIAN|PHILIPS".
  "|SENDO|KLONDIKE|SAGEM|MOBILE|ALCATEL|SONY"),
  $_SERVER["HTTP_USER_AGENT"]);
  // vrßcenφ nßvratovΘ hodnoty
  return $ret;
};
?>

Funkce IsMobile pro ASP:

<%
Function IsMobile()
'deklarace prom∞nnΘ pro regulßrnφ v²razy
Dim regEx
 
  'vytvo°enφ prom∞nnΘ pro regulßrnφ v²razy
  Set regEx = New RegExp
  'nastavenφ regulßrnφho v²razu (°φdφcφ °et∞zec)
  regEx.Pattern = "UP\.LINK|MIDP|UP\.BROWSER|NOKIA|MOT|SEC-" _
  & "|WAP|ERICSSON|SAMSUNG|SIE-|PHONE|PANASONIC" _
  & "|MITSU|LG|PORTALMMM|BLACKBERRY|SYMBIAN|PHILIPS" _
  & "|SENDO|KLONDIKE|SAGEM|MOBILE|ALCATEL|SONY"
  'nastavenφ nerozliÜovßnφ velikosti pφsmen
  regEx.IgnoreCase = True
  'spuÜt∞nφ porovnßnφ (vrßtφ nßvratovou hodnotu funkce)
  IsMobile = regEx.Test(Request.ServerVariables("HTTP_USER_AGENT"))
End Function
%>

Jak jsem dosp∞l k v²sledk∙m?

Nejd°φve jsem vytvo°il strßnku, kterß pou₧φvala v²Üe uvedenΘ skripty pro vypsßnφ identifikace prohlφ₧eΦe, ze kterΘ jsem cht∞l zφskßvat identifikace mobilnφch telefon∙ na zßklad∞ p°φsp∞vk∙ od u₧ivatel∙ strßnek. Ukßzalo se, ₧e to nenφ dobrß metoda, a proto mi DuÜan Janovsk² (Yuh∙) poskytl seznam osmdesßti Üesti identifikacφ mobilnφch prohlφ₧eΦ∙ z LOGu jeho webu, co₧ bylo sice velmi malΘ mno₧stvφ, ale postaΦujφcφ pro zßkladnφ anal²zu.

Vzhledem k tomu, ₧e zp∙sob zφskßvßnφ identifikaΦnφch °et∞zc∙ se mi zdßl nedostateΦn² (zdlouhav² postup a malß pravd∞podobnost zφskßnφ v∞tÜφho poΦtu zßjemc∙ o ·Φast), napadlo m∞, ₧e bych se po identifikacφch mobilnφch prohlφ₧eΦ∙ mohl poohlΘdnout na internetu. Poda°ilo se mi najφt seznam, kter² obsahoval (po odstran∞nφ r∙znΘho smetφ) 5 102 zßznam∙, a ten se mi zdßl ji₧ dostateΦn∞ velk² k praktickΘmu pou₧itφ.

Anal²zou tohoto seznamu jsem sestavil nejΦast∞ji se vyskytujφcφ °et∞zce, kterΘ jednoznaΦn∞ identifikovaly mobilnφ prohlφ₧eΦe, a sestavil jsem je podle Φetnosti jejich v²skytu do °φdφcφho °et∞zce, kter² jsem pak pou₧il v regulßrnφm v²razu ve funkci IsMobile.

Metodika pou₧itß p°i anal²ze

Nejprve jsem provedl odhad nejΦast∞ji se vyskytujφcφch °et∞zc∙ v identifikacφch mobilnφch prohlφ₧eΦ∙. Podφval jsem se tedy na identifikace a °et∞zec, kter² se na prvnφ pohled vyskytoval nejΦast∞ji, jsem pou₧il. PotΘ jsem poΦφtal Φetnost v²skytu t∞chto jednotliv²ch °et∞zc∙ a kontroloval °ßdky, kterΘ do v²sledku nezapadaly. Postupn∞ jsem tak urΦoval dalÜφ °et∞zce, kterΘ se daly pou₧φt. Postupn²m poΦφtßnφm Φetnostφ v²skytu t∞chto °et∞zc∙ jsem dosp∞l a₧ ke koneΦnΘmu sestavenφ °φdφcφho °et∞zce.

Vyu₧itφ funkce IsMobile

Tato funkce m∙₧e poslou₧it vÜem tv∙rc∙m strßnek, a¥ u₧ p°ipravovan²ch "ruΦn∞" Φi dynamicky generovan²ch, kte°φ necht∞jφ nebo nemohou udr₧ovat vφce verzφ strßnek (pro mobily a desktopy). Funkce se dß pou₧φt nejen pro odfiltrovßnφ definic CSS, ale v podstat∞ pro jakoukoli jinou filtraci informacφ, kterΘ se majφ nebo nemajφ zobrazovat p°i p°φstupu z mobilnφho telefonu (nap°φklad odfiltrovßnφ reklamnφch banner∙ a podobn∞).

Odkazy a zdroje

Bedna°φk, Bohumφr (17. 11. 2004)