Leren werken met de gps
Datum: 1 november 2009
Door: Spencer
In deze tutorial zetten we de eerste stappen in de wereld van locatie, gebruik makend van de ingebouwde gps ontvanger in de iPhone. We gaan een kleine applicatie bouwen die onze coordinaten op het scherm toont en hoe accuraat ons gps signaal is.
Voor deze tutorial ga ik ervan uit dat je met Interface Builder kunt werken, dat je weet wat outlets zijn en dat je de structuur van een kleine iPhone app begrijpt. We gaan gebruik maken van de ingebouwde gps van de iPhone. Hiervoor is de simulator niet geschikt dus ik ga ervan uit dat je een provisioning profile op je iPhone hebt staan en weet hoe je hiermee werkt.
Maak een nieuw project van het type View-based application. Noem je project "beginning gps". Xcode maakt nu een heleboel files zelf aan en het resultaat zou er als volgt moeten uitzien.
Dit wordt een heel simpel project waarbij we slechts 1 view nodig hebben. Xcode heeft ons hierbij geholpen en heeft reeds een view controller (beginning_gpsViewController) met bijhorende xib aangemaakt (beginning_gpsViewController.xib).
Wanneer we spreken over gps coordinaten, dan spreken we over 2 getallen: latitude en longitude. Daarnaast willen we ook de horizontale en verticale nauwkeurigheid op het scherm tonen dus we hebben 4 controls nodig op onze view. We gaan hiervoor controls van het type UILabel gebruiken.
Open beginning_gpsViewController.h en voeg 4 UILabel controls toe. Maak tevens de properties aan.
Open beginning_gpsViewController.m en @synthesize je 4 labels. Zorg ervoor dat je de 4 labels released in de dealloc functie.
Dubbelklik de resources folder en dubbelklik op beginning_gpsViewController.xib om Interface Builder te openen. Sleep 4 controls van het type UILabel naar je view. Het resultaat zou er ongeveer zo moeten uitzien.
Koppel de 4 properties in de view controller en de 4 UILabels in de view aan mekaar via de Connections Inspector. Het eerste label gebruiken we voor latitude, het tweede label voor longitude, het derde label voor horizontale nauwkeurigheid en het vierde label voor verticale nauwkeurigheid. Als je wil dan kan je zelf 4 extra labels toevoegen aan je view met strings zoals "Latitude:" voor meer duidelijkheid.
Op dit moment kun je je project builden en uitvoeren op je iPhone maar er gaat nog niet veel gebeuren. Het is tijd om de gps functionaliteit toe te voegen.
In de Frameworks boom kun je zien dat Xcode bij de aanmaak van ons project zelf 3 frameworks heeft toegevoegd: UIKit.framework, Foundation.framework en CoreGraphics.framework. Om gps functionaliteit toe te voegen hebben we een vierde framework nodig, nl. CoreLocation.framework. Rechterklik op Frameworks, Add, Existing frameworks en kies CoreLocation.framework.
Om coordinaten binnen te krijgen van onze gps ontvanger hebben we een instantie nodig van de klasse CLLocationManager. Open beginning_gpsViewController.h en voeg een instantie van CLLocationManager toe. Noem deze *locationManager. Het resultaat moet er ongeveer als volgt uitzien:
Open beginning_gpsViewController.m en vergeet @synthesize en release in de dealloc functie niet.
In bovenstaande screenshot zie je ook dat ik CLLocationManagerDelegate heb toegevoegd. Waarom ? Als straks onze applicatie klaar is dan kunnen we gaan rondwandelen met onze iPhone. Als we rondwandelen dan verandert onze gps positie. De iPhone heeft een object nodig dat hij kan verwittigen als de positie wijzigt. Dit mechanisme noemt men delegatie. We mogen niet eender welk type delegate declareren om deze signalen op te vangen. De location manager delegate moet conform zijn met het CLLocationManagerDelegate protocol.
Als we CLLocationManagerDelegate opzoeken in de helpfile van Xcode dan zien we dat dit protocol 2 optionele functies heeft waarop we kunnen reageren.
locationManager:didFailWithError:
en
locationManager:didUpdateHeading:
De eerste functie wordt aangeroepen als je applicatie geen gps coordinaten binnenkrijgt. Er kunnen verschillende oorzaken zijn. Een eerste mogelijkheid is dat de gebruiker "Don't allow" kiest bij het opstarten van je applicatie. Een tweede mogelijkheid is dat de gebruiker Location services heeft afgezet in de algemene instellingen van de iPhone.
De tweede functie is interessant want deze wordt opgeroepen elke keer als onze locatie wijzigt. Hierin kunnen we dus toffe dingen doen ... afstand (her)berekenen of andere acties die afhangen van onze positie. Als je beide functies uitwerkt in beginning_gpsViewController.m dan ziet het resultaat er ongeveer als volgt uit:
Het enige wat we nu nog moeten doen in onze applicatie is zeggen dat we willen starten met het ontvangen van gps signalen. We gaan dit doen in de viewDidLoad functie van onze view controller. Eigenlijk is dit niet de juiste plaats. In een locatie gebaseerde applicatie met meerdere views en view controllers doe je dit best in een meer toegankelijk object, zoals je application delegate. Deze laatste is ook een geschikte plaats om de location manager delegate uit te werken.
In deze tutorial met slechts 1 view volstaat het om alle functionaliteit in onze enige view controller uit te werken. De code om de location manager te starten zit er als volgt uit:
Je ziet dat hier heel wat gebeurt. We alloceren geheugen en initialiseren onze location manager. We zeggen tegen de location manager dat we zelf delegate gaan spelen en gaan reageren op de events die hij stuurt. We zeggen dat we willen verwittigd worden wanneer we ons 5 meter of meer verplaatsen en dat we een nauwkeurigheid willen van 10 meter. Tenslotte starten we de location manager.
Het enige wat we nu nog moeten doen is onze gps coordinaten en nauwkeurigheid tonen in onze 4 labels. Dit kunnen we doen in onze locationManager:didUpdateHeading: functie.
Nu is het tijd om je applicatie te builden en te installeren op je iPhone. Je gaat best even naar buiten zodat je een nauwkeuriger gps signaal hebt. Dit is slechts de eerste stap in de wereld van locatie gebaseerde applicaties.
In toekomstige tutorials gaan we meer geavanceerde dingen met de gps ontvanger doen.






