MobileDetect – detekce mobiliních zařízení

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
akadlec
Člen | 1326
+
0
-

Pokud jste narazili na problém s detekci zařízení které si prohlíží vaši aplikaci, je tento doplněk právě pro vás. Dokáže detekovat různá mobilní zařízení jako jsou telefony tak i tablety, tv a různe zobrazovače.

Celá detekce je založená na mobilním detektoru kteří jistě někteří z vás již znají a je inspirována podobným rozšířením pro symfony

Jejím použitím tak získáte službu která vám dokáže detekovat jaké zařízení uživatel používá, jaký má mobilní OS a mobilního User-Agenta. Jsou ze k dispozici i Latte makra a tak můžete podle zařízení přizpůsobit i smotný generovaný HTML obsah.

Pokud využíváte mobilní url, tak můžete také nastavit automatické přesměrování na tuto verzi, takže pokud vám uživatel navštíví stránky s mobilním zařízením, můžete jej přesměrovat na mobilní verzi např.: http://m.vase-stranka.cz či tabletovou verzi http://t.vase-stranka.cz atd. Chování jak se má přesměrovat se nastavuje v konfiguraci

Snad se vám bude toto rozšíření hodit. Vítám každý podnět na fix, upgrade atd…

TODO:

  • Pro přesměrování chci přidat možnost zapsání routy místo absolutní url, či mít možnost vybrat
  • Vyřešit předávání služeb do Latte maker
  • Přidat možnost vyřadit přesměrování pro konkrétní routy

Možné TODO:

  • Uvažuju že k tomu přidám ještě DeviceDetection co by mohla detekovat základní info i z klasických prohlížečů pokud by o to byl zájem
  • DeviceDetection by pak mohl umět i s kooperací s JS detekovat viewport atd. a tak by PHPko mohlo vědět jak velké zobrazovací zařízení má k dispozici uživatel a podle toho vybrat správný layout.

Editoval akadlec (10. 1. 2015 19:32)

akadlec
Člen | 1326
+
0
-

Instalace klasicky přes composer

{
    "require": {
        "ipub/mobile-detect": "dev-master"
    }
}

nebo

$ composer require ipub/mobile-detect:@dev

Poměrně dost info jsem shrnul v readme na gitu, tak snad bude vše jasné.

Editoval akadlec (24. 4. 2014 9:27)

Michal Vyšinský
Člen | 608
+
0
-

Ta traita vypadá skoro jako skrytá reklama :D

akadlec
Člen | 1326
+
0
-

Jop taky sem si toho všim ;)

sKopheK
Člen | 207
+
0
-

Přeji ti, aby do budoucna nebylo moc zařízení, která to detekovat nebude umět, aby to fungovalo co nejdéle a nejspolehlivěji, ale obecně bych radil raději jednu promyšlenou RWD verzi webu.

akadlec
Člen | 1326
+
0
-

@sKopheK: pro samotnou detekci to využívá knihovnu která je poměrně solidně aktualizována. Responzivní web se nehodí vždy a všude.

Jiří Nápravník
Člen | 710
+
0
-

suepr, brzo budu zase mobilní verzi řešit, tak to nebudu muset psát sám. Řeší to nějak i případ, když přijde člověk s mobilem, dostane se tedy na mobilní a on se přepne na full verzi, tak aby když příště přijde,tak se dostal na full verzi, jako chtěl minule a nebyl hozený na mobilní zase?

akadlec
Člen | 1326
+
0
-

No teoreticky by se v eventu mohly uprvit podminky a pokud si user setne verzi tak by mu ji mělo načítat.
Teď je to uděláno tak že pokud máš mobil a máš aktivní přesměrování na mobilní verzi, tak tě to přepne na url mobilní verze vždy.

Pokud ovšem nepoužíváš mobilní url, ale jen měníš layout tak si to ukládá jaký view máš aktuálně zvolen. Takže pokud přijde z mobilu na nemobilní verzi (bez přesměrování) tak si to do cookies uloží info že bys měl mít mobilní view. Info o tom pak budeš mít v tom helperu deviceView a nebo přímo v latte makrech. Pokud provedeš změnu pomocí služby deviceView tak si to změni cookie a můžeš na mobilu vidět i nemobilní nebo tablet verzi.

Jiří Nápravník
Člen | 710
+
0
-

Zatím jsem vždy používal mobilní URL. Ale když nad tím přemýšlím, možná by bylo i lepší používat jenom přepnutí view. Ještě uvidím jak to budu implementovat.

akadlec
Člen | 1326
+
0
-

Jako chtělo by to zvážit jak by se to mělo chovat a podle toho se to může upravit. Já to přimárně potřeboval pro detekci mobilního zařízení abych mohl změnit template komponenty. No ještě by mi bodlo vědět jak velké rozlišení má user k dispozici ale to udělám asi extra.

Zax
Člen | 370
+
0
-

akadlec napsal(a):

@sKopheK: pro samotnou detekci to využívá knihovnu která je poměrně solidně aktualizována. Responzivní web se nehodí vždy a všude.

Promiň, nechci flejmovat, ale kdy se třeba responzivní web nehodí? Měl jsem pár klientů, kteří si mysleli, že nic takového nepotřebují, ale když jsem jim pak ukázal web na netbooku a nutil je scrollovat do stran, tak hned obrátili :-) (netbook je teď kaput, ale záměrně si budu kupovat tablet s nízkým rozlišením, protože nic jiného než praktická ukázka klienta nepřesvědčí, hehe)

Máš nějaký příklad webu, který by bylo nevhodné dělat responzivně, ať se poučím? Díky.

Jiří Nápravník
Člen | 710
+
0
-

Zax: Preferuji v nekoiak pripadech radeji mobilni verzi nez responsive. Responsive resi jen preskladani ale ty data si stejne stahuje. napriklad mam nejaky pravy sidebar, ktery je nesmyslny mit na malem rozliseni jako je mobil. No a prenaset takovy sidebar na mobilnim internetu muze byt nekdy az zbytecny porod, a uzivatele s FUPem ti nepodekuji. Ostatne proc maji velke zrpavodajske portaly typu idnes, ihned apod pord mobiln iverze a ne responsives

akadlec
Člen | 1326
+
0
-

@Zax: tak jak uvedl @Jiří Nápravník jsou prostě weby kde je zbytečné řešit responzivitu pomocí css, js atd…nepotřebuješ zpracovat X požadavků atd pokud je to uživatel z mobilu, proč posilat XXXKb uživateli které pak zahodí? Pokud děláš nějaký blog či malou firemní prezentaci tak ti je mobilní verze zřejmě na nic, ale pokud děláš něco složitejšího je vhodné i k tomuto upravit výstup.

Zax
Člen | 370
+
0
-

To je sice fakt, ale i když máš mobilní verzi, tak se pořád hodí udělat full verzi responzivně. Responzivní weby totiž nejsou responzivní jen kvůli různým druhům přístrojů, ale i kvůli různým způsobům používání prohlížeče.

Představ si, že máš jen jeden monitor a z nějakého důvodu potřebuješ něco na netu a prohlížeč si chceš zobrazit v úzké nudli (typicky abys měl na očích nějaký program, ve kterém zrovna pracuješ). Proč by se ten obsah neměl přeskládat tak, abys nemusel scrollovat do stran?
Nebo máš nějakého seniora, který používá nějakou prehistorickou obrazovku 800×600 jenže ouha, tvůj web je optimalizovaný pro 1024×768 a chudák stařík aby se naučil používat vodorovný scrollbar.
Nebo naopak máš někoho s obří obrazovkou s nějakým brutálním rozlišením, tak proč mu nepřeskládat informace nějak horizontálněji, aby se ta plocha využila?

Ono to ani není nijak moc nákladnější na vývoj, stačí si udělat pár webů responzivně a pak už to jde úplně samo a přínos to má myslím si dost velký, byť jde třeba jen o jednotky procent návštěvníků.

EDIT: nicméně sidebar bych asi řešil třeba tím, že bych použil ten detector a jednoduchou podmínkou bych ho buď vykreslil nebo nevykreslil :-) Nechci, aby z mého příspěvku nějak vyplynulo, že tvůj detector sucks, mobile version sucks nebo tak něco, jenom si myslím, že responzivní weby se hodí všude ;-)

Editoval Zax (24. 4. 2014 23:25)

Tomáš Kolinger
Člen | 136
+
0
-

Já také preferuji jako uživatel mobilní verzi z výše uvedených důvodů.

Mimochodem… Vývoj responzivního designu je zaručeně nákladnejší a né o málo. Už jenom řešení pro obrázky je složité a vyžaduje proti klasickému řešení velkou režii.

Editoval Tomáš Kolinger (25. 4. 2014 0:30)

Zax
Člen | 370
+
+1
-

@Tomáš Kolinger: Co máš na mysli? Načítání obrázků se správnou velikostí kvůli úspoře dat nebo prostě jen ten fakt, že obrázek musíš dát do divu a napsat pár řádků css (což dost často musíš tak jako tak)? S tím načítáním souhlasím že je to složitější, ale určitě ne o moc víc než celá mobilní verze a pokud už máme mobilní verzi, tak nás to ani vůbec trápit nemusí a můžeme v responzivní verzi klidně načítat plnou kvalitu.

Sorry že tu tak flejmuji, ale já si musím responzivní design hájit. Mobilní verzi nijak neodsuzuji, jen si myslím, že existence mobilní verze není dostatečný důvod se na responzivnost úplně vyprdnout, protože to není jenom o tom, že se to zobrazí i na mobilu. Je to o tom, že se to zobrazí i když je člověk na PC a otevře si to v úzké nudli (a určitě přitom nebude lozit někde v patičce a hledat odkaz na mobilní verzi).

akadlec
Člen | 1326
+
0
-

Pánové myslím že se tady tak trošku odbočilo od tématu. Pokud chcete řešit to zda responzivní web ano či ne tak prosím jiné téma ano? Tady to nechme na diskuzi k doplňku.

Pokud někoho zajímá jaké zařízení a jejich OS toto rozšíření dokáže identifikovat, tak zde nalezene jejich seznam.

Yess
Člen | 16
+
0
-

Ahoj.. predovšetkým vďaka za super rozšírenie. Testoval som ho na čistom sandboxe aktuálnej verzie Nette 2.1.2. Detekcia funguje pekne, akurát som narazil na problém pri zmene device_view prostredníctvom GET parametru. Napríklad: ?device_view=full … Vznikne tento problém:

Possible problem: you are sending a HTTP header while already having some data in output buffer. Try OutputDebugger or start session earlier.

Otázka znie: Čo som spravil blbo? ..resp na čo som zabudol?

akadlec
Člen | 1326
+
0
-

@Yess: Ta chyba se ti objeví kdy? Mělo by to fungovat tak že se provede změna cookie na tebou zvolený view a provede se redirect.

Yess
Člen | 16
+
0
-

akadlec napsal(a):

@Yess: Ta chyba se ti objeví kdy? Mělo by to fungovat tak že se provede změna cookie na tebou zvolený view a provede se redirect.

Tak cookie sa zmení, ale pred tým redirectom to pravdepodobne krachne.

akadlec
Člen | 1326
+
0
-

Nemáš tam ještě něco přidáno či poměněno? Zkusil sem to v čistém sandboxu jak na homepage tak i na podstránce a provede se to korektně bez chyby. Jaký máš config?

Yess
Člen | 16
+
0
-

akadlec napsal(a):

Nemáš tam ještě něco přidáno či poměněno? Zkusil sem to v čistém sandboxu jak na homepage tak i na podstránce a provede se to korektně bez chyby. Jaký máš config?

Takže stiahol som čistý sandbox. Cez composer som nainštaloval podľa Git-u rozšírenie („ipub/mobile-detect“: „dev-master“). Podľa návodu na GitHube som pokraačoval ďalej samozrejme .. prihodil som do configu extension a v BasePresenteri mám len ten trait a funkciu createTemplate. Skúšal som detekciu zariadenia, čo funguje OK, takže toto by malo byť všetko vporiadku.

V configu mám momentálne toto:

# Mobile detector
mobileDetect:
	redirect:
		mobile:
			isEnabled: true
			statusCode: 301
			action: noRedirect
		detectTabletAsMobile: true
	switchDeviceView:
		saveRefererPath: true

a ešte do session som prihodil

autoStart: smart
akadlec
Člen | 1326
+
0
-

Hmm a ten error ti vyhodila laděnka? Můžeš zkusit vyhodit ten autoStart pro session? Případně někde nahodit tvůj sandbox? Mě se to totiž stále nedaří reprodukovat.

Yess
Člen | 16
+
0
-

akadlec napsal(a):

Hmm a ten error ti vyhodila laděnka? Můžeš zkusit vyhodit ten autoStart pro session? Případně někde nahodit tvůj sandbox? Mě se to totiž stále nedaří reprodukovat.

Hodil som to komplet na Github

Yess
Člen | 16
+
0
-

Čo na to hovoríš? Ja som prehľadal súbory, či tam niekde nieje BOM .. ale bez úspechu..

Skúsil som do index.php hodiť:

ob_start(function($s, $flag) {
    if ($flag & PHP_OUTPUT_HANDLER_START) {
    	$e = new \Exception;
		$s = nl2br("Output started here:\n{$e->getTraceAsString()}\n\n") . $s;
	}
	return $s;
}, 2);

rekuže čo to vypľuje … a ladenka zrazu nič nevypisuje.. ale tuším to nebude riešenie :D

akurát nastali ďaľšie problémiky:

  1. ten redirect spraví takto: localhost/sandbox/www → localhost/sandbox/www/sandbox/www
  2. do cookies správne zapíše len v prípade, ak je GET parameter device_view=full. V ostatných prípadoch nastaví cookie na not_mobile

Editoval Yess (28. 4. 2014 14:13)

akadlec
Člen | 1326
+
0
-

O víkendu jsem nestíhal, zkusím kouknout dneska.

akadlec
Člen | 1326
+
0
-

Ať dělám co dělám nedokáži tvou chybu při přesměrování reprodukovat. Tu níže zmíněnou s tvarem url jsem fixoval.

Zkus když tak ještě někde hodit config apache/php, možná máš zapnuté nějaké rozšíření co to dělá a já ho nemám.

Yess
Člen | 16
+
0
-

Asi máš pravdu…pokiaľ niesom na locale, tak to už funguje super

Editoval Yess (28. 4. 2014 16:19)

rumcais1
Člen | 80
+
0
-

Chci se zeptat jestli jste tu chybu vyřesili. Zkusil jsem hodit na hosting ten Yess sandbox a hlasí mi to tu samou chybu. Díky

akadlec
Člen | 1326
+
0
-

ne protože se nepodařila reprodukovat.

rumcais1
Člen | 80
+
0
-

Tady to mám na hostingu. http://hosting.pilsfree.net/rumcais/www/?…

Editoval rumcais1 (28. 5. 2014 12:52)

Jiří Nápravník
Člen | 710
+
0
-

@akadlec tak jsem se až teď dostal k té mobilní verzi. Nakonec jsem se rozhodl, že půjdu cestou, že podle zařízení pošlu konkrétní šablonu. Jde nějak rozumně udělat, že budu mít například šablonu homepage.latte a pro mobilní verzi se bude sahat na homepage.mobile.latte – ci neco podobného? Nepřijde mi moc ideální udělat jednu šablonu a tam ifovat.

David Matějka
Moderator | 6445
+
0
-

@JiříNápravník muzes prekryt metody formatTemplateFiles resp formatLayoutTemplateFiles v presenteru

Jiří Nápravník
Člen | 710
+
0
-

Díky za tip. Je nějaké obdobné řešení i pro komponenty? Předpokládám, že tam asi bude nejlepší nastavovat šablonu přes nějaky BaseControl, který se vždy podívá, zda nejde o mobil, či pod. nebo něco lepšího?

akadlec
Člen | 1326
+
0
-

@Jiří Nápravník: no pokud upravíš ty metody jak psal @matej21 tak si to můžeš rozhodnout tam ale to je pro některé už vyšší dívčí ;) proto to není uvedeno v readme. Ad komponenty, já to dělám tak že si v attached metodě ověřím co zobrazit a podle toho nastavím template. Aktuálně to používám na rozhodnutí zda daný control hodit to modalu nebo klasicky, když to bude na mobilu tak se zobrazí klasicky atd…

Siam
Člen | 54
+
0
-

Detekce funguje skvěle, ale bohužel funkce isMobile/isNotMobile nedělá to co jsem si myslel, že má dělat a to je detekce (pouze) mobilního telefonu. Tablet je brán totiž také jako mobilní zařízení.

Nešlo by přidat funkci jenom pro mobilní telefony? Jde mi hlavně o latte makra. Mohla by se jmenovat klasicky isPhone/isNotPhone.

akadlec
Člen | 1326
+
0
-

hele teoreticky to tam asi šlo dodělat, ale můžeš udělat podmínku s exkludování tabletu:

// Exclude tablets.
if( $detect->isMobile() && !$detect->isTablet() ){

}

pravda v makrech by to bylo hnusnější, takže to makro tam dodělám ;)

UP: tak jo je to teda tam. Je to tedy jedno makro:

{isPhone}Tady to bude videt jen na telefonu{/isPhone}

Makro isNotPhone je dle mě zbytečné, buď je to tedy mobilní zařízení phone/tablet a nebo to není mobilní zařízení, pokud chceš něco jen na mobilní zařízení ale aby to nebylo na telefonech tak na to je makro isTablet

Editoval akadlec (5. 1. 2015 20:32)

Siam
Člen | 54
+
0
-

akadlec:
podle mě není zbytečné. Tablet a desktop mají větší display a tak můžou zobrazovat stejné věci a také mají obecně lepší připojení k internetu. Na druhou stranu mobil je většinou připojený přes 3G síť, na které je fup a je pomalejší než třeba wifi. Proto se hodí něco nezobrazovat jenom pro mobily.

Třeba já osobně mám stránky, na kterých je anketa, lišta s tlačítky typu sdílet na FB, G+ apod a sloupec ve kterém jsou poslední komentáře. Jsou to vcelku užitečné věci, ale ne až tak moc, abych kvůli tomu zatěžoval stránky na mobilech. Takže to chci jenom na desktopu a tabletu.

Mohl by se tam prosím ještě dát i to isNotPhone?

akadlec
Člen | 1326
+
+1
-

no ok…je to teda tam ;) plus ještě makro isPhoneView

Siam
Člen | 54
+
0
-

Díky moc.

Rypi
Člen | 38
+
0
-

Ahoj,

také mám problém, pokud zavolám stránku s parametrem: ?device_view=mobile, dostanu stejnou chybu jako lidé výše.

do mailu ti pošlu laděnku, pokud se ti problém ještě nepodařilo reprodukovat…

Rozšíření registruji v configu, žádné nastavení neuvádím a ani v presenteru pak nic nemám. Jen v šabloně makra.
Automatická detekce funguje dobře, ale pokud uvedu ten parametr, tak tak mě to redirectuje a nette vyhodí zaloguje chybu. (nebo to tracy zachytí a redirect neproběhne…)

akadlec
Člen | 1326
+
0
-

Hele dělá to nette/http a jeho metoda redirect a zatím tedy nevím proč, tahle extension si redirect sama nikde nevolá.

Tak beru zpět…zřejmě je potřeba ukončit běh natvrdo aby se redirect provedl…

Editoval akadlec (7. 1. 2015 15:46)

akadlec
Člen | 1326
+
0
-

@Yess @Rypi : můžete pls zkusit? je tam udělaný fix pro přesměrování.

Rypi
Člen | 38
+
0
-

Skvělé! Perfektní doplněk.
Díky za něj :)

akadlec
Člen | 1326
+
0
-

Kdyby to někomu nešlo stáhnout či najít, měnil jsem název repo abych je sjednotil do jednoho tvaru…no přidal sem i nějaké základní testy

Rypi
Člen | 38
+
0
-

Ještě by to chtělo trochu opravit dokumentaci…

Snažím se použít rozšíření v presenteru $this->mobileDetect->isMobile(), ale po projití dokumentace atd je $this->mobileDetect stále NULL…

akadlec
Člen | 1326
+
0
-

Tak se ti zřejmě neinjectují služby do presenteru

Rypi
Člen | 38
+
0
-

Už jsem na to přišel, v dokumentaci je toto:

/** @var \IPub\MobileDetect\MobileDetect */
protected $mobileDetect

Doplnil jsem si @inject, středník, ale ještě bylo třeba dát proměnnou public. To mě nenapadlo…

akadlec
Člen | 1326
+
0
-

To jak si dostaneš službu do presenteru je na tobě, pokud máš vypnuté injectování tak samozřejmě tam musíš tu službu dostat jinak než pomocí traity.

Tomáš Brchaň
Člen | 13
+
0
-

Ahoj,
díky za super doplněk.

Mám jen takovou drobnost. Trochu se tam bije označení. Chci úplně jednoduchou věc, přepínat z notMobileView na mobileView. Očekával bych, že v makrech bude fungovat isMobileView a opakem bude isNotMobileView. Ale to není pravda, protože když přepnu na FULL view, tak makro isNotMobileView mi hodí false, takže musím dát isFullView. Jenže isFullView nefunguje u klasického desktopu (když ještě neznovolím žádný view), protože $this->deviceView->getViewType() mi vrátí ‚not_mobile‘.

Podle mě jsou tam zbytečně 2 stavy, které se vlastně kdyjí: ‚not_mobile‘ a ‚full‘. A nebo musí být doladěna podmínka pro makro isNotMobileView, protože isFullView patří do podmnožiny isNotMobileView.