1. 24 Ottobre 2009
Italians iPhone Developers meeting @ VeneziaCamp2009
Eduard Roccatello <eduard@roccatello.it>
2. GIS e Geolocalizzazione
CoreLocation Framework
MapKit Framework
Use case: ReLocate
Discussione
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 2
3. GIS - Geographic Information System
Software che lavora con il territorio; più
esattamente con l’informazione territoriale.
Consumer
Google Maps
Microsoft Live Search Maps
ViaMichelin
Yahoo! Maps
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 3
4. Business
Free & opensource software
▪ Molti software di alta qualità, aderenti agli standard
emanati da Open Geospatial Consortium (OGC).
Commerciale
▪ Autodesk
▪ ESRI
▪ Bentley
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 4
5. Cos’è cambiato?
Banda larga
Ampia diffusione di dispositivi mobile
La maggior parte delle applicazioni
tradizionali sono state riviste.
E se sfruttassimo la posizione geografica per
fornire nuove potenzialità?
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 5
6. Associare ad un documento multimediale
una coppia di coordinate geografiche.
Diffusa sul web per la condivisione di
fotografie e video.
Ma anche per eventi, strutture, punti di
interesse...
Qualsiasi elemento che possa essere
georeferenziato.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 6
7. HTML 5 offre supporto alla geolocalizzazione.
Browser che supportano la geolocalizzazione:
Mozilla Firefox 3.5
Apple Mobile Safari
Due modalità
Utilizzo di un ricevitore GPS
Database di geolocalizzazione tramite IP.
Accuratezza
Houston we have a problem...
Da 10 m del caso ottimo a circa 50 km nei casi peggiori.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 7
8. // controllo del supporto
if (navigator.geolocation){
navigator.geolocation
.getCurrentPosition(onSuccess, onError);
}
// stub per gestione errore
function onError(message) {}
function onSuccess(position) {
// debug con firebug ;)
console.dir(position);
var s = "LAT: " + position.coords.latitude +
"LON: " + position.coords.longitude;
alert(s);
}
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 8
9. 24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 9
10. Assisted GPS (A-GPS)
Ottimo perchè consente un fixing veloce.
Combina la triangolazione cellulare (LBS – Location
Base Service) con le informazioni relative alla
posizione dei satelliti.
▪ Al fine di ottenere il segnale GPS velocemente.
Migliore accuratezza rispetto al GPS tradizionale
▪ Fino a 10 metri contro i 30 classici.
Limitazioni
▪ Nessun accesso alle stringhe NMEA.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 10
11. Bussola magnetica - Magnometer
Consente di ottenere la direzione sui tre assi xyz
senza doversi spostare ed affidarsi al poco
accurato GPS.
Limitazioni ma anche applicazioni
▪ Soggetta a false letture dovute a campi magnetici esterni.
▪ Potreste volerlo utilizzare per trovare i fili elettrici nel
muro :-P
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 11
12. Dispositivi di localizzazione
Core Location Framework
▪ I dispositivi sono condivisi tra tutte le applicazioni e OS X
mobile.
▪ Non è possibile accedere direttamente ai dispositivi.
Gestire la mappa
MapKit Framework
▪ Supporto nativo alla mappa di Google.
▪ Solo con iPhone Firmware 3.0 e successivi.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 12
13. Framework alla base di iPhone OS.
Introdotto con iPhone OS 2.0
Può utilizzare la triangolazione cellulare, GPS e
WiFi (non in Italia).
Consente di trovare la posizione,
l’orientamento e la velocità di spostamento
del dispositivo.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 13
14. Core Location è basato su eventi.
Alla disponibilità di una nuova localizzazione
iPhone attiverà un evento.
Per poter utilizzare Core Location, le applicazioni
devono essere configurate per ricevere questi
eventi.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 14
15. Requisiti di base
Creare un’istanza della classe CLLocationManager
Assegnare un delegato alla classe che implementi
il protocollo CLLocationManagerDelegate
▪ Questa istanza intercetta gli eventi
▪ Si occupa di fatto di aggiornare tutti gli aspetti relativi
alla geolocalizzazione.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 15
16. Aprite Xcode 3.2
Create un nuovo progetto
View-Based project
Chiamatelo VeniceCamp
Aggiungete il framework CoreLocation
Add > Existing framework...
▪ CoreLocation.framework
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 16
17. Aggiungete gli header di CoreLocation.
Per ogni classe... O meglio usando
VeniceCamp_Prefix.pch
Dentro Other Sources
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#endif
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 17
18. Aggiungete una nuova classe
Cliccate su Classes
Add > New file...
Iphone OS
▪ Cocoa Touch Class
▪ Objective-C class
▪ Subclass of NSObject
Chiamatela FirstCLController.m
▪ Create anche il file .h
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 18
19. E’ il delegato per la gestione degli eventi
Deve implementare CLLocationManagerDelegate
Eventi di posizione
– locationManager:didUpdateToLocation:fromLocation:
– locationManager:didFailWithError:
Eventi di orientamento (opzionali – a meno di usare
la bussola)
– locationManager:didUpdateHeading:
– locationManagerShouldDisplayHeadingCalibration:
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 19
21. Dichiara la classe come aderente al protocollo
CLLocationManagerDelegate
Contiene un’istanza della classe
CLLocationManager, che viene esposta
tramite l’uso delle proprietà.
Dichiara solo i metodi per la location.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 21
23. Init crea l’istanza e inizializza una nuova
instanza di CLLocationManager.
Viene associata l’istanza della classe come
delegato dell’istanza del location manager.
I metodi del protocollo rispondono agli eventi
scrivendo dei messaggi nel log, utilizzando la
funzione NSLog.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 23
24. Definito il controller aggiungiamolo al nostro
ViewController preesistente.
Aprite VeniceCampViewController.h e
aggiungete le righe evidenziate.
@class FirstCLController
@interface VeniceCampViewController : UIViewController {
FirstCLController *locationController;
}
@property (nonatomic, retain)
FirstCLController *locationController;
@end
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 24
25. Aprite ora VeniceCampViewController.m
In testa aggiungete
#import “FirstCLController.h”
@implementation ...
@synthesize locationController;
Implementate i metodi seguenti
- (void) viewDidLoad {
[super viewDidLoad];
locationController = [[MyCLController alloc] init];
[locationController.locationManager startUpdatingLocation];
}
- (void) dealloc {
[locationController release];
[super dealloc];
}
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 25
26. Caricata la vista, il metodo viewDidLoad
inizializza il controller creato in precedenza ed
avvia il location manager con il metodo
startUpdatingLocation.
A questo punto possiamo provare
l’applicazione.
Compilate ed eseguite dal menu
Build > Build and Run.
Visualizzate la console dal menu Run > Console.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 26
27. Mantenere logica e visualizzazione separati è
fondamentale per assicurare una qualità
migliore.
Come passare i dati quindi dal controller per
CoreLocation alla vista?
Utilizzamo un protocollo e lo strumento dei
delegati.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 27
28. Aprite FirstCLController.h
Creiamo il protocollo LocatorDelegate dopo le
righe di importazione
@protocol LocatorDelegate
@required
- (void) locationUpdate:
(CLLocation *)location;
- (void) locationError:
(NSString *)error;
@end
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 28
29. Aggiungete una nuova variabile nell’interfaccia:
id delegate;
Create la proprietà:
@property (nonatomic, assign)
id<LocatorDelegate> delegate;
Modificate la dichiarazione di
VeniceCampViewController.h in
@interface VeniceCampViewController :
UIViewController <LocatorDelegate>
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 29
30. Per prima cosa aggiungete in testa
@synthesize delegate;
Aprite FirstCLController.m e aggiungete dopo
le righe di logging dei metodi
didUpdateToLocation e didFailWithError
rispettivamente:
[self.delegate locationUpdate:newLocation];
[self.delegate locationError:
[error description]];
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 30
31. Aggiungete una nuova variabile per contenere
una label come segue in
VeniceCampViewController.h
IBOutlet UILabel *locationLabel;
Aprite l’interface builder facendo doppio click
sullo xib VeniceCampViewController, in
Resources.
Aggiungete una label e collegatela al File’s
Owner.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 31
32. Entrambi i metodi del protocollo sono
obbligatori.
- (void) locationUpdate:(CLLocation *)location{
[locationLabel setText:[location description]];
}
- (void) locationError:(NSString *)error{
[locationLabel setText:error];
}
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 32
33. A questo punto è necessario aggiungere il
delegato al controller di Core Location.
Questo avviene nel metodo viewDidLoad
locationController.delegate = self;
A questo punto la comunicazione tra
controller e vista è impostata e funzionante.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 33
34. Proprietà
BOOL locationServicesEnabled
▪ Indica se nel dispositivo sono abilitati i servizi di
localizzazione.
CLLocation *location
▪ L’ultima location ricevuta
CLLocationDistance distanceFilter
▪ Distanza dall’ultima posizione dopo la quale essere
notificati degli eventi
▪ kCLDistanceFilterNone per tutti gli eventi
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 34
35. Proprietà
CLLocationAccuracy desiredAccuracy
Indica l’accuretezza desiderata. Possibili valori:
▪ kCLLocationAccuracyBest; (default)
▪ kCLLocationAccuracyNearestTenMeters;
▪ kCLLocationAccuracyHundredMeters;
▪ kCLLocationAccuracyKilometer;
▪ kCLLocationAccuracyThreeKilometers;
BOOL headingAvailable
▪ Indica se la bussola è disponibile nel dispositivo
CLLocationDegrees headingFilter
▪ Gradi di tolleranza per far scattare le notifiche di orientamento.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 35
36. Con l’introduzione di iPhone OS 3.0 è
disponibile un nuovo framework per la
gestione della mappa.
Possiamo utilizzarlo per visualizzare la
posizione sulla mappa.
Aggiungiamo il framework MapKit.framework
e l’import #import <MapKit/MapKit.h>
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 36
37. Aggiungete una nuova proprietà IBOutlet a
VeniceCampViewController.h
MKMapView *mapView;
@property (nonatomic, retain)
IBOutlet MKMapView *mapView;
Dall’Interface Builder aggiungete una mappa
e associatela al File’s Owner.
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 37
38. Aprite VeniceCampViewController.m
Nel metodo locationUpdate ora dobbiamo
aggiornare la mappa.
Si vuole ottenere lo zoom alla regione interessata.
MKCoordinateRegion region;
MkCoordinateSpan span;
span.longitudeDelta = 0.05;
span.latitudeDelta = 0.05;
region.center = [location coordinate];
region.span = span;
[mapView setRegion:region animated:TRUE];
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 38
39. Basta abilitare il flag showsUserLocation a
TRUE.
Possiamo anche utilizzare l’interface builder,
spuntando la scelta nelle proprietà.
Ricompilate, riavviate ed ecco uno splendido
puntino blu!
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 39
40. Posso utilizzare la annotation per visualizzare
elementi accessori sulla mappa.
Pushpin
Descrizioni
Posso disegnare polilinee e poligoni ma devo
utilizzare degli hack.
Alternative? Route-me library!
24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 40
41. 24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 41