HTML5 App
Herman van Dompseler In samenwerking met SURFnet 3 augustus 2012 Versie 0.3 - CONCEPT
HTML5 App
Contents Part 1: Wat is HTML5 ............................................................................................................................... 4 Laat maar zien, wat kan ik met HTML5? ............................................................................................. 4 HTML5 Resources ................................................................................................................................ 7 HTML5 Apps ............................................................................................................................................ 7 Native vs Hybrid vs Web Apps ............................................................................................................. 8 Native Apps ..................................................................................................................................... 8 Web Apps ........................................................................................................................................ 9 Hybride Apps ................................................................................................................................... 9 Een kijkje in de toekomst van Web Apps .......................................................................................... 10 Ok, maar wat kies ik nu voor mijn project?....................................................................................... 10 Beslisboom .................................................................................................................................... 11 Scenario’s ...................................................................................................................................... 13 Native vs. Hybrid vs Web Resources ................................................................................................. 13 Part 2: Hybride Apps uitgewerkt ........................................................................................................... 14 Architectuur....................................................................................................................................... 14 Stand Alone - Hybride App ............................................................................................................ 15 Connected - Hybride App ............................................................................................................. 16 App design & App resources ............................................................................................................. 17 Libraries ............................................................................................................................................. 18 Backend libraries ........................................................................................................................... 18 Frontend libraries .......................................................................................................................... 18 Werken met Phonegap...................................................................................................................... 19 Audio voorbeeld ............................................................................................................................ 20 Part 3: Een App bouwen voor Android.................................................................................................. 21 Stap 1: Hello World ........................................................................................................................... 21 Stap 2: Run en test je app.................................................................................................................. 21 Kopieer je App naar een device..................................................................................................... 22 Stap 3: Welke Android versie? .......................................................................................................... 23 Stap 4. Directory structuur ................................................................................................................ 23 Stap 5. Icon & Start-up scherm ......................................................................................................... 24 Stap 6. Schermgrootte....................................................................................................................... 25 Schermtype definitie ..................................................................................................................... 26 Images en text grootte .................................................................................................................. 28 2
HTML5 App CSS layouts met @media queries.................................................................................................. 28 Stap 7: Events (backend) ................................................................................................................... 29 Stap 8: Events (frontend) .................................................................................................................. 32 Stap 9: Off You Go! ............................................................................................................................ 32 Bijlage 1 – index.html ............................................................................................................................ 33 Bijlage 2 – page.css ................................................................................................................................ 35 Bijlage 3 – layout.css ............................................................................................................................. 36 Bijlage 4 – event.js ................................................................................................................................. 38
3
HTML5 App
Part 1: Wat is HTML5 HTML 5 is de ‘nieuwe’ standaard voor het presenteren van webpagina’s. HTML5 is niet één groot nieuw ding, maar een collectie van nieuwe standaarden en features op drie deelgebieden: 1. HTML5 2. Javascript (JS) 3. CSS3
‘Nieuw’ staat tussen aanhalingstekens omdat sommige HTML5 elementen al enige tijd te gebruiken zijn en andere elementen nog in ontwikkeling zijn. HTML 5 is daarom het best te omschrijven als een continue verbetering van de taal en tools voor het maken van web applicaties. Met de nadruk op applicaties ipv. statische pagina’s. In de combinatie van HTML 5, Javascript en CSS3 zijn het de HTML
die de declaratie van de elementen vormen. Met Javascript en CSS3 worden deze elementen dynamisch gemaakt. Bij programma’s in Javascript ligt de focus op het procedureel aanpassen van de elementen. Met CSS3 worden de elementen vorm gegeven en ligt de focus op de positionering en transities van elementen. En ja, je kunt het nu meteen gebruiken. Of de specificatie nu af is of niet, alle browsers/devices ondersteunen een subset van de mogelijkheden. Een webpagina die begint met is een HTML 5 pagina. Vervolgens is het belangrijk te kijken of de functionaliteit die je nastreeft beschikbaar is voor het platform waarop je het wilt laten zien. In één van de vele desktop browsers, op een Android of iOs device. Op http://caniuse.com/ staat een overzicht van de functionaliteiten voor de verschillende platformen.
Laat maar zien, wat kan ik met HTML5? In eerdere onderzoeken heb we al laten zien wat er zoal met HTML5 mogelijk is.
Eind 2010 heeft een theoretisch onderzoek naar de HTML5 tag laten zien wat er mogelijk is op video gebied met HTML5. Een demo pagina toont de implementatie.
4
HTML5 App
Vervolgens is er begin 2011 onderzoek gedaan naar andere HTML5 elementen. Van verschillende HTML5 elementen is een proefimplementatie gedaan om de resultaten te tonen. Bijvoorbeeld het element . De Opera browser toont dan een datum prikker, daarvoor is geen code meer aan te pas gekomen.
5
HTML5 App
Of de video wall, geschikt voor verschillende devices: desktop, tablet en mobile met dynamische elementen erin. Met deze video wall, kunnen 9 video’s parallel afgespeeld worden. De metadata werd lokaal opgeslagen op het device en is daardoor instant te raadplegen.
Eind 2011 is er een proof of concept gemaakt van een HTML5 Video Annotatie Player. Waarmee het mogelijk is een HTML5 video met meerdere mensen te annoteren en met sociale media erover te praten. Daarnaast is deze video player gepresenteerd in een element om de video speler een ‘gaming’ karakter te geven. Ook is er gekeken naar ondertiteling met WebVTT.
6
HTML5 App
Al deze onderzoeken waren vrij theoretisch en technisch georiënteerd, met proof of concept implementaties. Ze tonen aan dat alles wat denkbaar is, eigenlijk ook met HTML5 te maken is. Kijk eens op http://html5games.com/ of http://www.canvasdemos.com/om te zien dat het echt mogelijk is. Dit document zal een praktische handleiding worden voor het maken van HTML5 Apps met een eigen App als resultaat.
HTML5 Resources HTML specificatie van W3C CSS beschrijving van W3C
http://www.w3.org/TR/html5/ http://www.w3.org/Style/CSS/
All HTML 5
http://diveintohtml5.info/ http://html5rocks.com/ http://html5doctor.com/
All Javascript
https://developer.mozilla.org/en/JavaScript/
All CSS 3
http://www.css3.info/
ff checken
http://caniuse.com/ (voor welk platform?) http://html5games.com/ (oh, kan dat ook!) http://www.canvasdemos.com/ (en dit ook) http://wowslider.com/ (wow)
HTML5 Apps HTML5 is een webtechnologie, waarmee informatie toegankelijk wordt gemaakt via webbrowsers, tot voorkort voornamelijk toegepast op desktop en laptop computers met een scherm, toetsenbord en muis. Maar dit verandert, net zoals het Internet zich uitbreidt naar andere devices, zoals 7
HTML5 App smartphones, tablets, maar denk ook aan auto’s, koelkasten en anderen apparaten die aan internet verbonden worden. Zo zal ook HTML5 zich uitbreiden om een interface te bieden aan deze apparaten. De eerste logische stap is een HTML5 interface voor smartphones en tablets. Devices met aanraakschermen die (bijna) altijd verbonden zijn met Internet. Een website die geoptimaliseerd is voor gebruik op een smartphone of tablet wordt een Web App genoemd. Dit is een website die opgevraagd wordt met de browser van het device en die specifiek voor het device is ontworpen. De site reageert op het touchscreen en kan interactie hebben met bijvoorbeeld de GPS positie van het device. Voor een Web App is het typisch om naar een URL te browsen. Web Apps zijn het tegenovergestelde van Native Apps. Native Apps zijn voor een specifiek device gemaakte toepassingen, al dan niet verbonden met het Internet. Native Apps zijn programma’s die zonder webbrowser werken, maar juist rechtstreeks op het device zijn aangesloten. Een Native App wordt typisch uit de App store gedownload, waarna deze gebruikt kan worden. Het is een gevecht tussen deze twee uitersten: http://www.youtube.com/watch?v=fchbLzwtexk En er zit nog van alles tussen in. Goed beschouwd zijn er vier typen Apps te onderscheiden. 1. Native Apps, specifiek voor een device gemaakte toepassing, met specifieke code 2. Hybride Apps, voor een device gemaakte toepassing met generieke code 3. Web Apps die specifiek voor een mobiel device/platform zijn gemaakt a. Kunnen geïnstalleerd en gestart worden als Native Apps b. Interactieve/touch gui c. Client side rendering d. Offline available 4. Web sites, een website die geoptimaliseerd is voor mobiele platformen a. Worden bezocht door er naartoe te browsen b. Navigatie UI/algemene look & feel c. Server side rendering d. Alleen online De laatste laten we even buiten beschouwing, een aangepaste website wordt vaak ook als voorbeeld van Web App aangehaald, maar dat doen we hier niet. Dus als in dit document gesproken wordt over Web Apps, dan gaat het om specifiek voor een mobiel device gebouwde toepassing. En wat is dan een HTML5 App? Dat is een App die met HTML5 technologie is gemaakt en dat kan zowel een Web App als een Hybride App opleveren.
Native vs Hybrid vs Web Apps Native vs Web apps is een strijd tussen twee filosofieën. Met aan beide kanten voor- en tegenstanders. En waar twee vechten om een been… Native Apps De voordelen van Native Apps:
8
HTML5 App
Direct toegang tot de device hardware, zoals camera’s etc. EN direct interactie met het device, zoals notificaties aan de gebruiker EN integratie met andere apps o Web Apps hebben beperkt toegang tot het device ‘Runs faster’, wat voornamelijk geldt voor grafisch intensieve applicaties Native Apps kunnen de look & feel van het mobile OS gebruiken, dat levert een ‘smooth user experience’ o Web Apps kunnen een ‘native gevoel’ geven, door ze te starten vanaf het device en geen browser raamwerk om de App heen te maken.
Bijkomend voordeel, de App store:
Apps kunnen worden geplaatst in App stores en zijn daardoor makkelijk toegankelijk en kunnen makkelijk op het device geplaatst worden. o Web Apps worden via websites gedistribueerd Met Apps in App stores is ook geld te verdienen, via de App store kan een bedrag voor het downloaden van de App worden gevraagd, waarvan 70% voor de App ontwikkelaar is.
Web Apps De voordelen van Web Apps:
‘Write once, run many’, een generiek platform voor meerdere devices o Native Apps moeten voor iedere platform opnieuw gebouwd worden
Bijkomend voordeel, content beheer:
De content wordt van internet gehaald, er is dus één content store, die ook voor andere doeleinden, zoals een website, gebruikt kan worden. Content is daardoor makkelijk te beheren/wijzigen o bij Native Apps moet een nieuwe App worden geplaatst in de App store bij iedere update. Er wordt gezegd dat dit een tijdrovend en niet een triviaal proces is, vanwege oa. keuringen door App store owners.
De overeenkomsten tussen Native en Web Apps: Ja, die zijn er ook
Beiden typen apps zijn online/offline te gebruiken De programmeertalen waarin Native dan wel HTML5 Apps worden gemaakt verschillen wel: Android is Java, iOs is objective C en in HTML5 gebruik je Javascript. Maar met alle talen is hetzelfde te bereiken. Het is vaak de persoonlijke voorkeur van de maker die bepaalt wat het beste werkt. Voor native development heeft iedere aanbieder zijn eigen software development kit (SDK) waarmee ontwikkelaars aan de slag kunnen. Voor Web Apps gebruikt de ontwikkelaar zijn eigen favoriete tools.
Hybride Apps Even samenvattend: Native Apps zijn voor een specifiek device gemaakte toepassingen en een Web App is een website, specifiek voor een device gemaakt. 9
HTML5 App Een Hybride App is de combinatie: een Native App met HTML embedded. De HTML5, CSS3 en Javascript kan in de App opgeslagen worden (zoals bij een Native App) of van het web worden gedownload. Een Hybride App geeft de flexibiliteit van een Web App en de user experience van een Native App. Voordelen ten opzichte van een Native App:
Write once, in HTML5
Voordelen ten opzichte van Web Apps:
Gebruik een framework (Phonegap bv.), die de directe toegang tot het device omzet in webservices die met HTML5 zijn te raadplegen. Kunnen in App stores worden geplaatst en kan dus ook voor betaald worden.
Een kijkje in de toekomst van Web Apps Web Apps zullen waarschijnlijk meer op Native Apps gaan lijken. De volgende ontwikkelingen zijn nu gaande:
WebGL voor het versnellen van 3D grafische mogelijkheden in de browser Web App stores , om ook met Web Apps geld te kunnen verdienen en ze makkelijk te kunnen vinden/installeren. o Open App Market is een Web App store: http://www.openappmkt.com/ o Google heeft een eigen Webstore, https://chrome.google.com/webstore# o Mozilla werkt aan een Web App store, https://www.mozilla.org/enUS/apps/partners/ Er zullen steeds meer toegangsmogelijkheden komen voor Web Apps om van device specifieke toepassingen gebruik te maken. GPS is er bijvoorbeeld al. Meer zal er volgen.
Ok, maar wat kies ik nu voor mijn project? Je kunt een afweging maken op basis van de genoemde verschillen tussen de type Apps. Onderstaande vergelijking kan je daarbij helpen. Hier worden de Apps vergeleken op:
Device Access: de toegang tot de verschillende functionaliteiten van het device. o Web Apps hebben duidelijk minder toegang tot functionaliteiten ten opzichte van de andere twee typen. Speed: de snelheid waarmee de App moet werken en reageren. o Native Apps zijn het snelst te maken. Development cost: de prijs voor het ontwikkelen van de App. o De ontwikkeling van Native Apps zal in veel gevallen het intensiefst zijn, omdat voor iedere device specifieke expertise nodig is. App store (en het Approval Proces): heeft de App een plekje in de App store o Web Apps zijn niet in een App store te plaatsen
10
HTML5 App
Taken from: http://www.youtube.com/watch?v=Ns-JS4amlTc
Het zal echter niet voldoende zijn om op deze manier naar je App ontwikkeling te kijken. Wat in ieder geval ook meegenomen moet worden is:
Het soort App. o Ontsluit de toepassing veel content of is er juist veel interactie in de vorm van ‘gaming’. Welke uitstraling heeft de App. o Wil je naadloos aansluiten bij het device of juist aansluiten bij je eigen huisstijl/website. Waar zitten de gebruikers. o Je kunt bijvoorbeeld specifiek willen ontwikkelen voor iPhone/iPad gebruikers. Met welke technologie zijn de eigen ontwikkelaars bekend. o Wat bijvoorbeeld HTML5 betreft kan dit aansluiten bij de ontwikkeling van websites die vaak al gaande is. Het is min of meer bekende technologie.
Beslisboom Onderstaande flowchart helpt je bij het maken van een keuze. Er zijn drie gezichtspunten. Bekijk het ontwikkelen van de App: 1. Vanuit je eigen wens om een app te maken. 2. Vanuit de gebruikers van je App. 3. Vanuit de ontwikkelaar van de App. De kosten voor het ontwikkelen van de App zijn niet in deze beslisboom meegenomen. Het is duidelijk dat een aangepaste website die je gebruikt als Web App de minste kosten met zich mee brengt. Voor het ontwikkelen van device specifieke apps, zijn de kosten hoger en afhankelijk van het design. 11
HTML5 App
12
HTML5 App Scenario’s 1. Je wilt een high speed game ontwikkelen, en geen concessies wat betreft snelheid en grafische kwaliteit doen. De flowchart brengt je bij: Native App. 2. Je wilt een toepassing ontwikkelen waarbij je toegang nodig hebt tot de camera van het device. De flowchart brengt je bij: Hybrid App. (Native is ook een optie) 3. Je hebt online content aan te bieden en een mooie vormgeving ontwikkelt. Je hebt niet specifieke device toegang nodig. Je wilt wel dat mensen voor gebruik van je App betalen De flowchart brengt je bij: Hybrid App. 4. Je hebt online content aan te bieden, wat je deels ook gebruikt op je site. Voor de App heb je een nieuw design gemaakt, geschikt voor het formaat van het device. Je wilt dit net als je website gratis aanbieden De flowchart brengt je bij: Web App. 5. Je wilt dat je website ook op een smartphone of tablet is te bekijken met de browser van het device. De flowchart brengt je bij: Optimaliseer je website.
Native vs. Hybrid vs Web Resources The battle
http://www.youtube.com/watch?v=fchbLzwtexk
The debate
http://www.html5rocks.com/en/mobile/nativedebate http://econsultancy.com/uk/blog/7832-the-fight-getstechnical-mobile-apps-vs-mobile-sites http://buildmobile.com/native-hybrid-or-web-apps/
an in-depth video of the differences
http://www.youtube.com/watch?v=Ns-JS4amlTc
13
HTML5 App
Part 2: Hybride Apps uitgewerkt In dit hoofdstuk duiken we de wereld van Hybride Apps in. Om de App in een breder kader te plaatsen wordt eerst de architectuur geschetst. Vervolgens een klein beetje aandacht voor het design van de APP en daarna zoomen we in op de belangrijkste libraries die nodig zijn.
Architectuur Voor het ontwikkelen van een Native iPhone of Android App worden de volgende stappen ondernomen.
De programmeur schrijft zijn code in Objective C of Java. Hij maakt gebruik van een SDK als raamwerk voor zijn code. In het build proces wordt een App gemaakt. (.app of .apk) De app wordt in een App store aangeboden van waaruit hij op een device kan worden gedownload en geïnstalleerd.
iPhone en Android App ontwikkel methode
14
HTML5 App Stand Alone - Hybride App Om te kunnen programmeren in HTML5, CSS3 en Javascript moet er een brug gevormd tussen deze code en de App SDK. Hiervoor zijn verschillende Libraries gemaakt: 1. Frontend Libraries: javascript libraries die het maken van de look & feel van je applicatie verzorgen. Een voorbeeld hiervan is jQuery Mobile. 2. Backend Libraries: javascript libraries die toegang tot de SDK en functionaliteiten van het device verzorgen. Een voorbeeld hiervan is Phonegap.
Hybride App ontwikkel methode
15
HTML5 App Connected - Hybride App In de standalone Hybride App staat alle HTML5, CSS3 en Javascript in de App zelf. Echter niet alle resources hoeven in de App te staan. Een App kan web resources voor content gebruiken. Net zoals een bestaande website de web resources gebruikt.
16
HTML5 App Hybride App + Website ontwikkel methode
In deze architectuur zijn, ten opzichte van de stand alone versie, twee stromen toegevoegd. Daarmee worden een API server en een Web server gerealiseerd. 1. De backend stroom: vanuit de resources is een database opgebouwd die via eigen code en een favoriet raamwerk op Internet wordt ontsloten middels een API. Een API levert data in een XML en/of JSON formaat. 2. Een frontend stroom: vanuit HTML5, CSS3 en Javascript wordt al dan niet met een (jQuery) library een website gebouwd. De XML of JSON uit de API levert content aan deze website. Deze website is te bekijken met een browser op een device. Merk op dat dit ook een smartphone of tablet kan zijn. In deze connected architectuur zie je duidelijk de belangrijkste overeenkomsten tussen ontwikkelen voor web sites en Apps:
Programmeer in HTML5, CSS3 en Javascript (de grijze blokken) en maak daarbij gebruik van libraries. Daar is het in dit onderzoek natuurlijk allemaal om te doen. Put uit één bron van resources. Resources kunnen ofwel toegankelijk gemaakt worden via de App ofwel via de API, die op zijn beurt ook de website van content voorziet.
App design & App resources Een goed interactie design van een App is van essentieel belang. Zomaar een website kopiëren is niet de optimale oplossing.
Waar met name rekening mee moet worden gehouden is het formaat van het device. Een scherm van een smartphone is het kleinst en een smartphone wordt vaak in portrait bediend. Een tablet scherm is groter en wordt weer vaker landscape gebruikt. Een smartphone kan op ieder moment van de dag op iedere lokatie gebruikt worden. Dat moet snel en effectief werken. Dat is een andere beleving dan wanneer je met een tablet of laptop op schoot aan het browsen en lezen bent. Ook qua visueel design vergt het bouwen van een App aandacht. Het is belangrijk te bepalen in hoeverre aangesloten moet worden bij het design van het device waarop gekeken wordt.
Design van een App is verder geen onderdeel van dit rapport. Google en Apple hebben beiden richtlijnen voor het ontwikkelen van een App, die erg interessant zijn om te lezen.
Android: http://developer.android.com/design/index.html iOS: http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/Mobil eHIG/Introduction/Introduction.html
Een belangrijke vraag die nog wel beantwoordt moet worden alvorens een Connected Hybride App te gaan ontwikkelen is: 17
HTML5 App Welke resource moet in de App en welke kan via de API opgehaald worden? Er zijn twee uitgangspunten: 1. De App moet een snelle response geven, dat zijn gebruikers ook van Native Apps gewend. 2. Er moet niet teveel data verkeer gegenereerd worden tussen App en API, dat bespaard de gebruiker netwerkkosten. Om aan deze uitgangspunten te kunnen voldoen is het zinvol zoveel mogelijk resources in de App beschikbaar te hebben en zo min mogelijk uit de API te halen. Toch kan het belangrijk zijn om content, wat toch al beschikbaar is op de website, via de API toegankelijk te maken, omdat:
Content dan niet gedupliceerd hoeft te worden. Niet voor elke content wijzigingen een nieuwe App moet worden gemaakt.
Content die uit de API opgehaald moet worden kan bovendien het beste in het JSON formaat worden beschreven, waarmee delen van een HTML pagina worden vervangen. De Javascript processing en de HTML rendering van de content vindt dan plaats op het device zelf. Hierdoor wordt de netwerkbelasting zo klein mogelijk gehouden en wordt de response van de API zo snel mogelijk gemaakt.
Libraries In de architectuur is aangegeven dat gebruik gemaakt kan worden van verschillende libraries. Libraries verzorgen de koppeling met het achterliggende device, in dit document backend libraries genoemd. Of libraries leveren interface elementen, frontend libraries genoemd. Backend libraries Backend libraries maken verschillende functionaliteiten van een device toegankelijk voor javascript code. De library die in dit onderzoek verder wordt onderzocht is Phonegap. In Plaats van Phonegap wordt nu ook de naam Cordova gebruikt. Dit is de naam voor de core van het Phonegap systeem dat middels de Apache Software Foundation open source wordt aangeboden, terwijl Phonegap door Adobe is overgenomen. (http://incubator.apache.org/cordova/ ). Eeen aantal backend libraries:
Phonegap: http://phonegap.com/ Appmobi: http://www.appmobi.com/ Appcelerator (Titanium): http://www.appcelerator.com/
Frontend libraries Van frontend libraries die het ontwikkelen van de App interface eenvoudiger maken zijn meerdere smaken, die varieren van heel uitvoerige libraries tot kleine, handige scripts. Bekende libraries zijn:
Modernizr: http://modernizr.com/, voor het detecteren van HTML 5 ondersteuning door de browser. jQuery, http://jquery.com/ en jQueryMobile: http://jquerymobile.com/, voor een algemeen javascript framework. 18
HTML5 App
jQTouch: http://www.jqtouch.com/ en Zepto.js: http://zeptojs.com/, alternatieve javascript raamwerken voor mobile devices. Sencha, http://www.sencha.com/, biedt een compleet en uitgebreid raamwerk voor mobile development. Dojo, http://dojotoolkit.org/features/mobile, focused op het maken van een native look & feel mobile App.
Werken met Phonegap Phonegap is een Javascript library, waarin functies zijn gedefinieerd die je kunt gebruiken om toegang te krijgen tot functionaliteiten van een device. Of het device nu een Android, iPhone of ander device is, de Javascript functies zijn hetzelfde. Dit is een overzicht van de elementen waar Phonegap toegang toe geeft:
Events, Events voor starten en pauzeren van App etc.
Capture, voor het opslaan van geluid, foto’s en videos met de bijbehorende tools van het device. Camera, voor het maken van een foto met de camera tool van het device. o Kan dus ook met capture, wat is het verschil? Media, voor het opslaan en afspelen van geluid, met oa. play en pause interface.
Accelerometer, de bewegingssensor. o Geeft antwoord op de vraag naar welke kant beweegt het device. Compas, het kompas. o Geeft antwoord op de vraag welke kant wijst het device op. Geolocation, de GPS. o Geeft antwoord op de vraag waar bevindt het device zich.
File, voor het maken van files op het device Storage, voor het maken van een Web SQL database voor het device
Contacts, geeft toegang tot het adresboek van het device Notification, geeft toegang tot tekstuele notificaties, maar ook geluiden en vibraties etc. Device, geeft informatie over de hardware en software van het device Connection, geeft information over de netwerk status, wifi of 3G etc.
De interface tot de functies van deze elementen staat op: http://docs.phonegap.com/en/2.0.0/index.html
19
HTML5 App
Audio voorbeeld Voor sommige functies is het mogelijk meerdere oplossing te kiezen, neem bijvoorbeeld het afspelen van geluid. De HTML5 oplossing voor afspelen van geluid is gebruik maken van de tag in de HTML pagina. Met javascript kan dan vervolgens de functie play() aangeroepen voor het afspelen van het fragment. De phonegap oplossing voor het afspelen van geluid is gebruik maken van het media object en ook dit object heeft een play() methode. Voordeel van gebruik van de Phonegap oplossing is dat het hiermee ook mogelijk is om audio op te nemen, met de startRecord() methode. Met de HTML5 oplossing is het alleen mogelijk af te spelen.
20
HTML5 App
Part 3: Een App bouwen voor Android Hieronder volgt een stap voor stap handleiding voor het bouwen van een Hybride App met gebruik van Phonegap en de Android SDK.
Stap 1: Hello World Hello World! Maak je eerste Phonegap project gebruikmakend van de handleiding op: http://docs.phonegap.com/en/2.0.0/guide_gettingstarted_android_index.md.html#Getting%20Started%20with%20Android Deze handleiding volgen komt neer op de volgende acties:
Installeer Eclipse Download en configureer Android SDK Installeer Android Development Tools (ADT) plugin vanuit Eclipse Download Phonegap Opzetten van de development omgeving
Stap 2: Run en test je app Daarvoor heb je eerder de ADT plugin geïnstalleerd. Het is belangrijk te begrijpen hoe je deze plugin kunt gebruiken om verschillende devices te simuleren. Hieronder zie je twee devices voor tests.
21
HTML5 App
1. Dit is een emulatie van een Sony Experia U, een smartphone met High density scherm, portrait georiënteerd. a. resolutie: 480x854 b. density: 240 2. Dit is een emulatie van een yarvik gotab, een tablet met een low density scherm, landscape georiënteerd. a. resolutie: 1024x768 b. density: 120 Als je een applicatie wilt testen, dan klik je op “Run” en kies je een van deze virtual devices waarop je wilt draaien. Kopieer je App naar een device Je zult je App eerder of later ook willen testen op een real device, naast deze virtuele devices. Daarvoor hoef je je App niet meteen in een store te plaatsen, maar kun je een zelf gemaakte .apk file op je device installeren. Je moet daarvoor wel iets doen.
Maak eerst je eigen certificaaat waarmee je de App signeerd. o maak met keytool een key + keystore Exporteer je App o ‘right klik’ projectnaam -> android tools -> export signed application package Verplaats .apk bestand naar je device o Koppel met usb je device en kopieer bestand 22
HTML5 App
Installeer de .apk op je device.
Het maken van het certificaat hoef je maar één keer te doen, je kunt hiermee alle toekomstige app signeren.
Stap 3: Welke Android versie? Kijk op http://developer.android.com/about/dashboards/index.html voor de laatste verdeling van de verschillende Android versies. In juli 2012 was het gebruik van Android:
2.1: Éclair: 4% 2.2: Froyo: 15% 2.3[.3]: Gingerbread: 60% 3.2: Honeycomb: 2% 4.0[.3]: Ice Cream Sandwich: 16% 4.1: Jelly Bean: 1%
Door te ontwikkelen voor Android vanaf versie 2.1 wordt totaal dus 98% van de android gebruikers bereikt. Maar dat betekent dat je code moet voldoen aan API level 7 waarop Eclair is gebouwd. Terwijl Jelly Bean al op API Level 16 zit. Versie 2.3.3 Gingerbread is veruit de meest gebruikte versie met 60% en 4.0.3 Ice Cream Sandwich is de hardste stijger met nu 16%. Tijdens het opzetten van je project dien je hierin een keuze te maken.
Stap 4. Directory structuur Tijdens het opzetten van je project ben je al verschillende directories in de Android SDK tegen gekomen. De belangrijkste voor het ontwikkelen van een HTML5 App is de directory assets/www. Dat is in feite de documentroot, zoals je hem ook gewend bent bij het ontwikkelen van een website. In deze directory is de index.html de eerste file die gestart wordt. Het is aan te bevelen om vervolgens de CSS, JS en graphics (GFX) in subdirectories te plaatsen.
23
HTML5 App
Eclipse explorer voor Android
Stap 5. Icon & Start-up scherm Alvorens je App start, zie je een start icoon, die jouw App representeert. Na klikken op het icoon verschijnt vervolgens een splash screen gedurende het opstarten van je App. Deze images moet je voor ieder platform apart behandelen. Bij Android wordt het start icoon gedefinieerd in de XMLmanifest file: android:icon="@drawable/ic_launcher" In de directory res/drawable* staat de file ic_launcher.png, dit is het icoon. Als je een splash screen wilt tonen als je App start, dan geef je voor Android een splash screen op in de belangrijkste Java file met de volgende twee regels:
24
HTML5 App super.setIntegerProperty("splashscreen", R.drawable.splash); super.loadUrl("file:///android_asset/www/index.html", 10000);
Dit splash screen blijft tien seconden staan, na het laden van je App kun je het screen eventueel eerder verwijderen met: setTimeout(function() { navigator.splashscreen.hide(); }, 2000);
Ook het splashscreen, splash.png, moet gekopieerd worden in de res/drawable* directories, net als het start icoon.
Stap 6. Schermgrootte Op http://developer.android.com/guide/practices/screens_support.html lees je over de verschillende formaten waar je rekening mee kan/moet houden. Android verdeeld de formaten met een eenheid: 'dp', dat staat voor density pixel. Een density pixel is het zelfde als een gewone pixel (px) bij een dichtheid van het scherm van 160 dpi (dot per inch). Dit wordt de gemiddelde dichtheid genoemd. Bij deze dichtheid is het meest geschikte formaat voor een button 48x48 pixels, zodat je comfortabel met je vinger kunt aanwijzen. Bij een dichtheid van het scherm van 240 dpi is de density 1,5 x zo groot. Dat betekent dat je op het scherm ook 1.5 keer zo grootte buttons moet neerzetten, 72x72 pixels dus, om het zelfde formaat button te creëren voor een vinger. Verschillende densities zijn:
low: 120 dpi, 36x36 buttons medium: 160 dpi, 48x48 buttons high: 240 dpi, 72x72 buttons xhigh: 320 dpi, 96x96 buttons
Verschillende schermgrootte worden uitgedrukt in density pixels:
small: 426dp x 320dp normal: 470dp x 320dp large: 640dp x 480dp xlarge: 960dp x 720dp
Ontwikkel je voor Android specifiek, dan kun je voor ieder formaat de juiste images maken en in de daarvoor bestemde directory neerzetten. De Android SDK bepaalt dan welk image, voor het device waar de App op draait, het meest geschikt is.
25
HTML5 App Schermtype definitie Het design van je App is hier van cruciaal belang. De drie belangrijkste designs die zijn te onderscheiden zijn:
Ontwikkel voor een smartphone o width: < 768 o orientation: portrait o dpi: 160 Ontwikkel voor een tablet o width: > 768 o orientation: landscape o dpi: 160 Ontwikkel voor high resolution, iPad3 & new smartphones o Width: ALL o Orientation: ALL o dpi: > 240
Met een combinatie van deze designs kan voor veel devices ontwikkeld worden. In de voorbeeld App die is gemaakt komt dit tot uiting in een twee koloms applicatie voor een tablet en dezelfde data in één kolom voor een high resolution smartphone.
Twee koloms tablet layout
26
HTML5 App
Eén kolom smartphone layout
Het voorbeeld van de code om dit te realiseren wordt in de bijlage gegeven. 1. Index.html staat in bijlage 1, dit is de html pagina 2. Page.css staat in bijlage 2, dit is de default vormgeving, zoals deze op het tablet wordt getoond. 27
HTML5 App 3. Layout.css staat in bijlage 3, dit is de layout die wijzigt voor de smartphone en voor high density schermen. 4. Event.js staat in bijlage 4, dit is de koppeling tussen joouw applicatie en de Phonegap en jQueryMobile events. Images en text grootte De button grootte is in het vorige hoofdstuk al ter sprake gekomen. Normale buttons zijn 48x48 pixels. Voor high density schermen gebruik je 72x72 pixels. Voor text grootte geldt hetzelfde. Normale text grootte is 12 pt. Voor high density schermen gebruik je dan 18 pt, zodat de tekst leesbaar blijft. Je kunt voor verschillende densities verschillende images gaan gebruiken. Let wel op dat je al je images in CSS moet definiëren om dit te laten werken. Een alternatief is om van vector images gebruik te gaan maken in SVG. Vector images is ook een HTML5 goodie en .svg files kun je gebruiken in de tag. Een tool om SVG images te maken is Inkscape, http://inkscape.org/. CSS layouts met @media queries Om de juiste layout te kunnen maken moet allereerst in de HTML code gedefinieerd worden hoe het scherm wordt gezien. Dit is de zogenaamde viewport. Voor gebruik met CSS willen we graag dat de viewport net zo groot is als het scherm. Zodat het device niet automatisch gaat zoomen. Deze viewport regel wordt opgenomen in de index.html: <meta name="viewport" content="user-scalable=no, width=device-width, height=device-height, initial-scale=1, minimum-scale=1, maximum-scale=1, target-densityDpi=device-dpi" />
In CSS kunnen we vervolgens het device herkennen en de layout afhankelijk maken met @media queries: 1. Met CSS kun je voor portrait of landscape mode ontwikkelen: /* for portrait or landscape mode */ @media screen and (orientation: portrait) { /* portrait layout */ } @media screen and (orientation: landscape) { /* landscape layout */ }
2. Het ontwerp afhankelijk van de breedte van het scherm maken: /* fixed width layout */ /* standard width */ @media screen and (max-width: 767px) { 28
HTML5 App /* portrait layout */ } /* for layout with great widths */ @media screen and (min-width: 768px) { /* landscape layout */ }
3. Het ontwerp aanpassen aan de scherm resolutie /* for normal size devices */ body { font-size: 12px; } /* for high resolution devices, > 240 dpi */ @media screen and (-webkit-min-device-pixel-ratio: 1.5) { body { font-size: 18px; } } /* In plaat van -webkit..., zou je onderstaande moeten kunnen gebruiken, maar dat werkt (helaas) niet... */ /* @media screen and (min-resolution: 240dpi) { */
Merk op dat, indien gewenst, je App in portrait of landscape mode geforceerd kan worden. In de Android XMLmanifest file neem je dan op: android:screenOrientation="landscape"
Stap 7: Events (backend) Het gebruik van je applicatie is event gestuurd. Als er iets gebeurd met het device, dan krijgt je applicatie dat te horen van Phonegap en daar moet je iets mee doen. Als de gebruiker input geeft aan je applicatie, dan wil je daar ook iets mee, touch en swipe wordt in het volgende hoofdstuk behandeld. Nu eerst de device events zoals: de applicatie is gestart, de batterij raakt op, de netwerk verbinding valt weg. De Phonegap events worden beschreven op: http://docs.phonegap.com/en/2.0.0rc1/cordova_events_events.md.html#Events De belangrijkste events die voor zowel Android als iOs te herkennen zijn, zijn:
deviceready, is de applicatie gestart en klaar voor gebruik pause/resume, de applicatie is gepauzeerd en hervat online/offline, de applicatie heeft wel/geen netwerkverbinding 29
HTML5 App
batterycritical/batterylow/batterystatus, de batterij status krijgen/opvragen.
Let op, je moet eerst “deviceready” afvangen, dan de rest pas. De code voor het afvangen van deze Phonegap events kun je opslaan in event.js. Allereerst is dit code om de events in verschillende fasen te laden: 1. Fase 1, laad het ‘ondeviceready’ event na laden van de index.html pagina. loadFase1: function() { document.addEventListener("deviceready", Cordova.DeviceReady, false); },
2. Laad fase 2 tot 5 na het ‘ondeviceready’ event, zodat je zeker weet dat de App er klaar voor is. (fase 2, zijn de andere events van Phonegap, fase 3 en 4 zijn user input event, fase 5 zijn overige events.)
loadFase2: function() { document.addEventListener("pause", Cordova.Pause, false); document.addEventListener("resume", Cordova.Resume, false); document.addEventListener("online", Cordova.Online, false); document.addEventListener("offline", Cordova.Offline, false); document.addEventListener("batterycritical", Cordova.BatteryCritical, false); document.addEventListener("batterylow", Cordova.BatteryLow, false); document.addEventListener("batterystatus", Cordova.BatteryStatus, false); }, // touchStart=mouseDown, touchEnd=mouseUp, touchMove=mouseMove loadFase3: function() { document.addEventListener("touchStart", Touch.Start, false); document.addEventListener("touchEnd", Touch.End, false); document.addEventListener("touchMove", Touch.Move, false); }, loadFase4: function() { // alert("swipe events"); // jQuery $('#page').live('tap',function(event) { alert("tap"); }); $('#page').live('taphold',function(event) { alert("hold"); }); $('#page').live('swipeleft',function(event) { alert("swipeleft"); }); $('#page').live('swiperight',function(event) { alert("swiperight"); }); }, loadFase5: function() { $(window).live("orientationchange", Misc.OrientationChange); } } 30
HTML5 App
Vervolgens is dit de code waarmee de Phonegap Events worden afgehandeld: // Cordova events Cordova = { // let's go from here! DeviceReady: function() { alert ("ready"); // now fase 2 Event.loadFase2(); // now fase 3 default touch events // and fase 4 library gestures Event.loadFase3(); Event.loadFase4(); // fase 5 misc events Event.loadFase5(); // go for user in 3 secs. setTimeout(function() { navigator.splashscreen.hide(); }, 3000); //cordova.exec(null, null, “SplashScreen”, “hide”, []) }, // we are put in the background and back in business Pause: function() { }, Resume: function() { }, // we are online or offline Online: function() { }, Offline: function() { }, // battery stuff BatteryCritical: function(info) { }, BatteryLow: function(info) { }, BatteryStatus: function(info) { } }
In de index.html HTML pagina laadt en start je fase 1 met:
31
HTML5 App <script type="text/javascript" charset="utf-8" src="js/events.js"> <script type="text/javascript"> Event.AddOnload(function() {Event.loadFase1();});
Stap 8: Events (frontend) De backend events worden afgevuurd door Phonegap. De frontend Events worden getriggerd door de gebruiker. De gebruiker kan het scherm aanraken en swipen etc. Voor het opvangen van gebruiker events zijn verschillende Javascript libraries ontwikkelt. Voor een willekeurig overzicht zie: http://www.queness.com/post/11755/11-multi-touch-and-touch-eventsjavascript-libraries. Een aantal libraries heb ik geprobeerd, zoals hammer.js en QuoJS.js omdat deze klein zijn en alleen focussen op user input van tablets. Maar uiteindelijk heb ik toch besloten om met jQueryMobile aan de slag te gaan. Ik vond jQueryMobiel de events het beste registreren. jQueryMobiel events worden in fase4 geladen, het opvangen gaat als volgt: $('#page').live('tap',function(event) { alert("tap"); }); $('#page').live('taphold',function(event) { alert("hold"); }); $('#page').live('swipeleft',function(event) { alert("swipeleft"); }); $('#page').live('swiperight',function(event) { alert("swiperight"); });
Let op dat in de Android XMLmanifest file de volgende regel goed is gespecificeerd, zodat oriëntatie veranderingen van het tablet/smartphone juist opgevangen worden: android:configChanges="orientation|keyboardHidden|screenSize" Zorg er ook voor dat de <scripts> in de header geladen worden en niet in de body. Als scripts in de body worden geladen, dan zal jQueryMobile alle scripts dubbel uitvoeren. Zie http://jquerymobile.com/demos/1.1.1/docs/pages/phonegap.html voor specifieke Phonegap tips voor jQueryMobile.
Stap 9: Off You Go! Nu de belangrijkste stappen genomen zijn, kun je je eigen ontwerp in HTML5, CSS3 en javascript gaan maken!
32
HTML5 App
Bijlage 1 – index.html <meta name="viewport" content="user-scalable=no, width=device-width, height=deviceheight, initial-scale=1, minimum-scale=1, maximum-scale=1, target-densityDpi=device-dpi" /> Hello World <script type="text/javascript" charset="utf-8" src="js/cordova-1.8.1.js"> <script type="text/javascript" charset="utf-8" src="js/jquery-1.7.1.min.js"> <script type="text/javascript" charset="utf-8" src="js/jquery.mobile-1.1.1.min.js"> <script type="text/javascript" charset="utf-8" src="js/events.js"> <script type="text/javascript"> Event.AddOnload(function() {Event.loadFase1();}); <section>
HTML5 is een webtechnologie, waarmee informatie toegankelijk wordt gemaakt via webbrowsers, tot voorkort voornamelijk toegepast op desktop en laptop computers met een scherm, toetsenbord en muis. Maar dit verandert, net zoals het Internet zich uitbreidt naar andere devices, zoals smartphones, tablets, maar denk ook aan auto's, koelkasten en anderen apparaten die aan internet verbonden worden. Zo zal ook HTML5 zich uitbreiden om een interface te bieden aan deze apparaten.
<section> 33
HTML5 App
De eerste logische stap is een HTML5 interface voor smartphones en tablets. Devices met aanraakschermen die (bijna) altijd verbonden zijn met Internet.
34
HTML5 App
Bijlage 2 – page.css #page { border: solid 1px black; width: 980px; margin: 0 auto; } #header { height: 100px; } #content { margin: 10px; border: solid 1px black; width: 600px; float: left; } #sidebar { margin: 10px; border: solid 1px black; width: auto; min-width: 150px; max-width: 280px; float: right; } #footer { margin: 10px; margin-top: 50px; clear: both; }
35
HTML5 App
Bijlage 3 – layout.css /* a device: - width < 800 - portrait - 160 dpi - targets a mobile phone - layout is one small column (with sidebar underneath) another device: - width > 800 - landscape - 160 dpi - targets a tablet - layout is two columns, one big with sidebar yet another device: - width does not matter - orientation does not matter - > 240 dpi - targets a high resolution screen, new smartphones and ipad3 /* /* for normal size devices */ body { color: red; background-color: #FFF; font-size: 12px; } /* for high resolution devices, > 240 dpi */ /* does not compute... */ /* @media screen and (min-resolution: 200dpi) { */ @media screen and (-webkit-min-device-pixel-ratio: 1.5) { body { color: green; background-color: #FFF; font-size: 18px; } } /* decide what to do with the layout: 1. fix to portrait or landscape mode. 2. fix to width of the device. */ /* fixed width layout */ /* standard width */ @media screen and (max-width: 799px) { #page { 36
HTML5 App width: auto; } #header { height: auto; } #content { width: auto; float: none; } #sidebar { float: none; } } /* for layout with great widths */ @media screen and (min-width: 800px) { #default }
37
HTML5 App
Bijlage 4 – event.js // Load & Register events // Cordoba 1.9.0: android + iOs Event = { AddOnload: function(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { if (oldonload) { oldonload(); } func(); } } }, loadFase1: function() { document.addEventListener("deviceready", Cordova.DeviceReady, false); }, loadFase2: function() { document.addEventListener("pause", Cordova.Pause, false); document.addEventListener("resume", Cordova.Resume, false); document.addEventListener("online", Cordova.Online, false); document.addEventListener("offline", Cordova.Offline, false); document.addEventListener("batterycritical", Cordova.BatteryCritical, false); document.addEventListener("batterylow", Cordova.BatteryLow, false); document.addEventListener("batterystatus", Cordova.BatteryStatus, false); }, // touchStart=mouseDown, touchEnd=mouseUp, touchMove=mouseMove loadFase3: function() { document.addEventListener("touchStart", Touch.Start, false); document.addEventListener("touchEnd", Touch.End, false); document.addEventListener("touchMove", Touch.Move, false); }, loadFase4: function() { // alert("swipe events"); // jQuery $('#page').live('tap',function(event) { alert("tap"); }); $('#page').live('taphold',function(event) { alert("hold"); }); $('#page').live('swipeleft',function(event) { alert("swipeleft"); }); $('#page').live('swiperight',function(event) { alert("swiperight"); }); }, loadFase5: function() { 38
HTML5 App $(window).live("orientationchange", Misc.OrientationChange); } } // Cordova events Cordova = { // let's go from here! DeviceReady: function() { alert ("ready"); // now fase 2 Event.loadFase2(); // now fase 3 default touch events // and fase 4 library gestures Event.loadFase3(); Event.loadFase4(); // fase 5 misc events Event.loadFase5(); // go for user in 3 secs. setTimeout(function() { navigator.splashscreen.hide(); }, 3000); //cordova.exec(null, null, “SplashScreen”, “hide”, []) }, // we are put in the background and back in business Pause: function() { }, Resume: function() { }, // we are online or offline Online: function() { }, Offline: function() { }, // battery stuff BatteryCritical: function(info) { }, BatteryLow: function(info) { }, BatteryStatus: function(info) { } } // Touch events Touch = { 39
HTML5 App
// start start: function() { }, // end end: function() { }, // move move: function() { // prevent to move the page with your finger event.preventDefault(); } } // Misc events Misc = { // orientation OrientationChange: function(e) { if(e.orientation == "landscape") { alert("landscape"); } else { alert("portrait"); } } }
40