Your SlideShare is downloading. ×
Sviluppare applicazioni geolocalizzate per iPhone
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Sviluppare applicazioni geolocalizzate per iPhone

4,802

Published on

Published in: Technology, News & Politics
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,802
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
78
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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
  • 20. @interface FirstCLController : NSObject <CLLocationManagerDelegate> { CLLocationManager *locationManager; } @property (nonatomic, retain) CLLocationManager *locationManager; - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation; - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error; @end 24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 20
  • 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
  • 22. @implementation FirstCLController @synthesize locationManager; - (id) init { self = [super init]; if (self != nil) { self.locationManager = [[[CLLocationManager alloc] init] autorelease]; self.locationManager.delegate = self; } return self; } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { NSLog(@"Location: %@", [newLocation description]); } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { NSLog(@"Error: %@", [error description]); } - (void)dealloc { [self.locationManager release]; [super dealloc]; } @end 24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 22
  • 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
  • 42. Dubbi, domande? 24 Ottobre 2009 Eduard Roccatello @ Italian iPhone Developer Meeting 42

×