De supermarkt van iBeacons

Nu de grote lijnen uitgeschreven zijn voor de voorstudie van mijn bachelorproef is het tijd om de implementatie van de testapplicatie verder uit te werken en verder onderzoek te voeren naar iBeacons. Eerst en vooral ben ik gestart met alle iBeacons die op de markt zijn op te speuren en van elke iBeacon de belangrijkste eigenschappen te noteren in een document. Zo kreeg ik na enig zoekwerk een mooi overzichtje van de verschillen en gelijkenissen tussen de verschillende iBeacons die momenteel op de markt zijn. Uit mijn oplijsting bleek dat de verschillende exemplaren niet zoveel verschillen van elkaar. De verschillen die ik gevonden heb waren op vlak van bereik, batterij, prijs en terrein. Die laatste was wel de meest interessantste wat mij betreft. Er is momenteel één iBeacon op de markt die op alle terreinen kan werken, zo ook onderwater.

Om deze oplichting te kunnen maken ben ik vertrokken van een blogbericht waarin heel wat iBeacons stonden opgelijst en zo ben ik beginnen rondsurfen naar de website van alle fabrikanten en daar de specificaties doorgenomen van de iBeacons die zij fabriceren.

Na deze oplichting ben ik gestart met de verdere uitwerking van mijn testapplicatie. Het is de bedoeling dat deze applicatie gegevens over iBeacons ophaalt via de TapCrowd API. Ik heb dus een API connectie in mijn applicatie moeten verzorgen en tevens ook een manier moeten vinden om deze gegevens ook lokaal te stockeren. Dit heb ik gedaan met behulp van Core Data. Core Data is een framework om lokaal gegevens op te slaan op iOS toestellen. Het werkt volgens het entity-relationship model en dus te vergelijken met het ADO.NET Entity Framework bij Visual Studio dat we geleerd hebben op de hogeschool.

Eens de data aangeleverd werd voor mijn testapplicatie ben ik gestart met de verwerking ervan. Van de opgehaalde iBeacons waren vooral de UUID, major en minor belangrijk. Op basis van die gegevens moet mijn applicatie in staat zijn om deze iBeacons te zoeken. Met zoeken bedoel ik, nagaan of de iBeacons zich binnen de detecteerbare perimeter van het iOS toestel dat de applicatie runt, bevindt.

Bronnen:

iBeacons, booming business!

Hoi! De afgelopen 2 weken heb ik heel wat research omtrent iBeacons uitgevoerd en deze research ook gedocumenteerd. iBeacons zijn kortweg geformuleerd Bluetooth bakens. Zij adverteren op intervaltijden altijd hetzelfde pakketje. Dit pakket bevat een UUID, een major, een minor en een txPower waarde. De txPower waarde is de sterkte van het signaal van een beacon, gemeten op 1 meter afstand. Op basis van deze waarde kan de afstand tot een beacon geschat worden. Als onderdeel van mijn research heb ik ook de kracht van Twitter gebruikt. iBeacons is een nieuwe technologie die nog volop in ontwikkeling is, dagelijks worden er dus nieuwe dingen ontdekt. Ik heb me op Twittter dan ook geabonneerd op enkele vooraanstaande spelers in de iBeacon industrie zodat ik dagelijks geïnformeerd wordt over het doen en laten van iBeacons. Een conclusie die ik nu reeds al kan trekken uit mijn research is dat iBeacons hot zijn. Er zijn enorm veel mogelijkheden met deze technologie die onze toekomst kunnen veranderen. Alleen al onze manier van shoppen kan veel interactieve worden. Je kan meldingen krijgen van coupons, wanneer je in de buurt bent van een winkel uitgerust met iBeacons.

Tussen de research door ben ik ook begonnen met de lay-out van mijnt testapplicatie uit te werken. Hiervoor heb ik gebruik gemaakt van een third party library die een mooie weergave van de viewcontrollers verzorgt, CHSlideController genaamd. Deze zorgt ervoor dat je vanuit een menu een item aanklikt, de desbetreffende viewcontroller gekoppeld aan dat menu item als het ware “ingeslide” wordt.

Daarna heb ik ervoor gezorgd dat mijn applicatie beacons kon detecteren en ook weergaf op welke afstand mijn toestel zich bevond van de beacon. Eens ik die afstand had, kon ik beginnen met het uitwerken van een strategie om de positie te bepalen van een toestel op basis van de signalen van drie beacons. Hiervoor heb ik een eenvoudige manier gekozen. De afstandsformule opschrijven van elke beacon tot het toestel. Zo krijg ik drie vergelijken. Ik zowaar mijn wiskundige achtergrond vanuit het secundair onderwijs nodig nu. Aangezien er maar twee onbekende variabelen, de x en y coördinaat van mijn toestel, te vinden waren, vertelt de lineaire algebra ons dat dit stelsel kan herleid worden naar een stelsel van twee vergelijkingen. Met behulp van de determinantenregel van Cramer kon ik dan deze vergelijkingen oplossen naar de onbekenden x en y.

Voor ik dit alles ging implementeren, was het nu tijd om eens de reeds gedane research te documenteren, zodat het niet gewoon bij een bestand met links bleef en kennis in mijn hoofd. Een deel van mijn stageopdracht is namelijk ook een studie over iBeacons maken, zodat TapCrowd later deze kennis kan halen uit mijn proef en niet de hele research opnieuw hoeven te doen. Met dit te documenteren ben ik een weekje zoet geweest.

Tot de volgende!

Bronnen:
http://en.wikipedia.org/wiki/Cramer’s_rule
https://www.cocoacontrols.com/controls/chslidecontroller

Part of the team

Deze week heb ik mijn stageopdracht gekregen van mijn stagementor. Mijn opdracht draait rond positiebepaling met iBeacons. Daarnaast dien ik ook onderzoek te voeren naar de nauwkeurigheid van geofences. Voor deze opdracht dien ik een testapplicatie te ontwerpen waarin deze zaken grafisch worden weergegeven. 

Ik ben dus eerst gestart met wat dingen op te zoeken over geofences, omdat mijn stageplek deze technologie al verwerkt had in enkele applicatie. In de apple docs bevindt zich een mooie gids omtrent locatiebepaling, waarin onder andere ook geofences vermeld staan. https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009497 

Maandagnamiddag moest ik echter mijn research staken, omdat ik werd betrokken bij de het fixen van bugs in de city-app Knokke-Heist, waarvoor ik vorige week enkele features had geschreven. De projectmanager van TapCrowd vroeg me om enkele tickets vanop Jira af te werken. Jira is een softwarepakket voor projectmanagement dat kan communiceren met de gitclient Bitbucket. Al snel bleek dat ik toch niet op één namiddag gedaan zou hebben met deze tickets, want iets later vroeg de lead iOS developper me ook om zijn tickets aangaande deze applicatie af te werken, omdat ik nu toch into deze applicatie was. 

De dagen erop heb ik me dus bezig houden met het afwerken van deze tickets. Voor het eerst had ik echt het gevoel van mee te draaien in een ICT team. Mijn afgewerkte tickets werden steeds getest door de projectmanager en ik kreeg daarover dan ook feedback of ze afgewerkt waren zoals verwacht werd. 

Op het einde van de week werd dan een update voor deze applicatie in de app store geplaatst. Volgende week staat er dus een app in de store waar ik een steentje heb aan bijgedragen.

Knokke, mondaine, euhm mobiele applicatie

Afgelopen week kreeg ik een eerste echte opdracht ik moest de city-app Knokke-Heist uitbreiden met enkele extra features. Zo moest in een TableView bestaande uit venues een icoontje geplaatst worden bij venues die voldoen aan een bepaalde voorwaarde. Zo kan de gebruiker zonder door te klikken direct al zien welke venues voldoen aan die voorwaarde. Daarnaast diende de applicatie ook uitgebreid te worden met een categorieën filter voor de venues.

Om te detecteren welke venues voldoen aan de voorwaarde heb ik gebruikt gemaakt van een bestaande query die al in TapCreator aanwezig was. Deze query haalde per venue de metavalues op. Zo kon ik met een if else constructie makkelijk checken welke metavalues voldeden aan de voorwaarde en dus ook welke venues. Die query heb ik dan via een for loop laten uitvoeren op elke venue en indien de venue voldeed aan de voorwaarde werd een icoontje toegevoegd aan de TableViewCell.

Tijd om aan de categorieënfilter te beginnen nu! Hiervoor diende ik via een filtericoon in de navigatiebar boven de TableView door te linken naar een filterpagina. De filterpagina bevatte dan een checklist met de categorieën die verbonden waren aan de gekozen launcher vanuit het hoofdmenu. Een launcher is bvb het menu item Shopping en aan Shopping zijn dan bvb verbonden Damesmode, Optiek, Schoenen… Per ingeladen venue ging ik dus checken welke categorieën er nog verbonden waren aan die venue naast Shopping. Deze categorieën hield ik dan bij in een NSMutableArray, uiteraard enkel unieke records, dus indien de array de categorie al bevatte werd we niet toegevoegd. Deze methode is natuurlijk wel generiek geschreven zodat we kan gebruikt worden in een module, dus even goed kon deze methode gebruikt worden voor het launcheritem Nightlife bvb of voor een launcheritem in een compleet andere city-app.

Eens de lijst overlopen kon ik de categorieën lijst doorgeven aan de filterpagina die dan met behulp van een TableView een mooie checklist creëerde van de categorieën zodat de gebruiker kon aan en afvinken op welke categorieën hij wou filteren. Eens de gebruiker zijn keuze gemaakt had heb ik ervoor gezorgd dat via een DisMiss methode gekoppeld aan een “Done” button de geselecteerde categorieën werden doorgeven naar de overzichtspagina van de venues. Daar werd dan via een SQL query de reeds gefilterde lijst op de launchercategorie nog eens verder gefilterd op de geselecteerde categorieën.

Tot slot heb ik de bestaande zoekfunctie voor de overzichtslijst ook uitgebreid zodat ook gewicht kon worden in een gefilterde lijst van venues. Dit heb ik ook gedaan met een gelijkaardige query op de database als de vorige, alleen dat nu ook een wildcard search werd meegegeven aan de query.

De kennismakingsronde is over

Na een week van tutorials was ik de programmeertaal Objective C toch al wat meer gewend. Voor ik me kon verdiepen in de code van Tapcreator was het echter ook wel nog eens nuttig om wat te oefenen zonder de Storyboard files van Xcode. Storyboard files zijn bestanden waar je heel het grafische gedeelte van je applicatie in kwijt kan. Het nadeel hiervan is echter dat bij applicaties die veel mogelijke navigeerschermen hebben het overzicht om duur verloren raakt. https://developer.apple.com/library/mac/documentation/ToolsLanguages/Conceptual/Xcode_Overview/Edit_User_Interfaces/edit_user_interface.html Daarom is het handiger om in zo een gevallen met .xib files te werken. In plaats van één groot grafisch bestand, kunnen we nu meerdere grafische interfaces beheren per aparte view controller. Zo heb ik dus geprobeerd om eens een tableview met xib files te maken. Daarnaast heb ik ook nog een tutorial gevolgd om een api in te lezen. Ditmaal heb ik een simpele applicatie gemaakt die de YouTube API consumeert om de gebruiker een interface te bieden waarmee hij YouTube videos kan opzoeken en afspelen. http://www.touch-code-magazine.com/how-to-make-a-youtube-app-using-mgbox-and-jsonmodel/ 

Genoeg tutorials tijd om de code van TapCreator eens te analyseren en proberen uit te zoeken hoe de grote lijnen in elkaar zitten. Naast TapCreator is er ook nog het TapTarget platform, dat zich eigenlijk bovenop TapCreator bevindt, De komende zeken zal ik echter enkel in TapCreator werken. TapTarget is het marketing platform, hiermee kunnen bedrijven bijvoorbeeld zien hoe vaak gebruikers bepaalde menu’s in hun applicatie aanklikken. Ook kunnen ze hiermee campagnes lanceren bijvoorbeeld met behulp van pushnotificaties. Stel nu bijvoorbeeld dat een klant in de buurt van een product komt dat in promotie staat dan wou de applicatie een pushnotificatie kunnen versturen naar de klant, zodat deze daarvan op de hoogte wordt gebracht. Tot zover TapTarget, terug naar TapCreator. TapCreator is het platform waarmee TapCrowd via een webinterface applicatie kan creëren door het aan en afvinken van modules. 

Ik kreeg via een BitBucket account toegang tot deze code. Via BitBucket en GIT wordt de code van TapCreator up to date gehouden. Nu was het zaak om uit te zoeken hoe al deze verschillende modules opgebouwd worden en hoe een applicatie weet welke modules het moet inladen en welke niet. Dit gebeurt door middel van een wisselwerking tussen de TapCrowd API en de applicatie. Ik kreeg toegang tot een DemoEvent applicatie om op basis van deze applicatie uit te dokteren hoe TapCreator werkt. 

Een eerste belangrijke issue bij TapCreator zijn Localized strings. Dit zijn eigenlijk bestanden die vertalingen bevatten voor allerlei handelingen binnen applicatie. Bijvoorbeeld “Push here” wordt in het Nederlands “Klik hier”. Op basis van dergelijke files wordt een applicatie automatisch vertaald wanneer de gebruiker de taal van zijn Iphone wijzigt. Uiteraard enkel ondersteunde talen door de applicatie. Zo hoef je geen drie verschillende applicaties te maken, wanneer je een applicatie in drie talen wenst. 

Daarna heb ik me vooral bezig gehouden met te ontrafelen hoe de code de API aanspreekt en hoe alles in een lokale database opgeslagen wordt op het toestel zelf. Daarin speelde de zogenaamde AppParser class een cruciale rol. 

Tot slot heb ik ook al een nieuwigheid opgezocht die zich nog niet in de code van TapCreator bevindt. Momenteel worden afbeeldingen van evenementplannen zoals bijvoorbeeld van Batibouw in één geheel ingeladen, maar dit is eigenlijk overbodig, omdat de gebruiker toch niet gans deze map kan zien op het scherm van zijn toestel. Daarom zou het veel handiger zijn om enkel in te laden wat de gebruiker ziet en dus de afbeelding in verschillende delen op te splitsen. Google Maps hanteert deze techniek van zogenaamd tile-based mapping. https://github.com/perlmunger/BitmapSlice Na wat google werk vond ik deze demo hiervan, waarbij een image in verschillende delen wordt ingeladen, waardoor het geheugen veel minder belast wordt.

Vaarwel uitslapen, hallo TapCrowd

Deze week ben ik mijn stage begonnen bij het Gentse TapCrowd. TapCrowd is werkzaam in de mobile apps industrie. Het bedrijf draait rond 3 platforms TapCreator, TapTarget en TapEvent. Deze hebben Android, iOS en webgebaseerde toepassingen. De komende maanden zal ik me ontplooien als een iOS developer.

De voorbije week heb ik me vooral bezig gehouden met de basis te leren van Objective C. Dit is een programmeertaal die mij niet aangeleerd is op school, dus is enige opleiding in deze taal nodig.

De eerste dag heb ik mijn omgeving opgezet. Ik heb een Mac Mini ter beschikking en daarop heb ik Xcode geïnstalleerd een softwarepakket, dat de SDKvan iOS bevat. Daarna heb ik enkele tutorials over Objective C doorgenomen waaronder deze http://cocoadevcentral.com/d/learn_objectivec/ . Nadat ik de basissyntax van Objective C had doorgenomen kon ik dan beginnen met het maken van een eerste basis iOS app. Aangezien TableViews heel veel gebruikt worden bij iOS apps ben ik gestart met een simpele TableView in elkaar te knutselen.

Op dag twee kon ik er direct invliegen met nog meer tutorials. API’s worden veel gebruikt om apps te ontwikkelen, dus kon het zeker geen kwaad om ook eens te leren hoe je een API aanspreekt. Met deze tutorial http://tutorials.veasoftware.com/2013/09/20/twitter-api-version-1-1-user-timeline-in-ios-7/ ben ik erin geslaagd een eenvoudige Twitter applicatie voor iPhone te maken. Verder heb ik ook wat geëxperimenteerd met locatiebepaling in iOS. Locatiebepaling die veel batterij slurpt, locatiebepaling die weinig batterij slurpt, op basis van WiFi, op basis van het mobiele netwerk.

Daarna ben ik aan de slag gegaan met deze link http://www.techotopia.com/index.php/IOS_7_App_Development_Essentials een website die verscheidene tutorials bevat over vele basisdingen binnen iOS. Zo heb ik geleerd hoe je local storage kan doen op twee manieren, ofwel via sqlite ofwel via de core data. Beiden maken gebruiken van een database. Daarnaast heb ik ook geëxperimenteerd met splitviews en pickerwheels.

De laatste dag van mijn eerste week heb ik me verdiept in het aanspreken van de camerafunctie. Ook heb ik de third party segue controllers CHSlideController bestudeerd https://github.com/beat843796/CHSlideController/tree/master/CHSlideController. Deze slide controller wordt gebruikt in sommige custom apps van TapCrowd. En tot slot heb ik ook nog een belangrijk onderdeel in programmeertalen bestudeerd, namelijk threading.

Een hele boterham voor mijn eerste week, die ook wel wat vermoeiend was met het aanpassen aan een werkritme.