42
24 Ottobre 2009 Italians iPhone Developers meeting @ VeneziaCamp2009 Eduard Roccatello <[email protected]>

Sviluppare applicazioni geolocalizzate per iPhone

Embed Size (px)

Citation preview

Page 1: Sviluppare applicazioni geolocalizzate per iPhone

24 Ottobre 2009Italians iPhone Developers meeting @ VeneziaCamp2009

Eduard Roccatello <[email protected]>

Page 2: Sviluppare applicazioni geolocalizzate per iPhone

GIS e Geolocalizzazione CoreLocation Framework MapKit Framework Use case: ReLocate Discussione

2Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 3: Sviluppare applicazioni geolocalizzate per iPhone

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

3Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 4: Sviluppare applicazioni geolocalizzate per iPhone

Business

Free & opensource software

▪ Molti software di alta qualità, aderenti agli standard emanati da Open Geospatial Consortium (OGC).

Commerciale

▪ Autodesk

▪ ESRI

▪ Bentley

4Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 5: Sviluppare applicazioni geolocalizzate per iPhone

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à?

5Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 6: Sviluppare applicazioni geolocalizzate per iPhone

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.

6Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 7: Sviluppare applicazioni geolocalizzate per iPhone

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.

7Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 8: Sviluppare applicazioni geolocalizzate per iPhone

// 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);

}

8Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 9: Sviluppare applicazioni geolocalizzate per iPhone

9Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 10: Sviluppare applicazioni geolocalizzate per iPhone

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.

10Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 11: Sviluppare applicazioni geolocalizzate per iPhone

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

11Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 12: Sviluppare applicazioni geolocalizzate per iPhone

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.

12Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 13: Sviluppare applicazioni geolocalizzate per iPhone

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.

13Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 14: Sviluppare applicazioni geolocalizzate per iPhone

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.

14Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 15: Sviluppare applicazioni geolocalizzate per iPhone

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.

15Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 16: Sviluppare applicazioni geolocalizzate per iPhone

Aprite Xcode 3.2

Create un nuovo progetto

View-Based project

Chiamatelo VeniceCamp

Aggiungete il framework CoreLocation

Add > Existing framework...

▪ CoreLocation.framework

16Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 17: Sviluppare applicazioni geolocalizzate per iPhone

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 17Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 18: Sviluppare applicazioni geolocalizzate per iPhone

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

18Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 19: Sviluppare applicazioni geolocalizzate per iPhone

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:

19Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 20: Sviluppare applicazioni geolocalizzate per iPhone

@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

20Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 21: Sviluppare applicazioni geolocalizzate per iPhone

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.

21Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 22: Sviluppare applicazioni geolocalizzate per iPhone

@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

22Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 23: Sviluppare applicazioni geolocalizzate per iPhone

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.

23Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 24: Sviluppare applicazioni geolocalizzate per iPhone

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

24Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 25: Sviluppare applicazioni geolocalizzate per iPhone

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];

}

25Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 26: Sviluppare applicazioni geolocalizzate per iPhone

Caricata la vista, il metodo viewDidLoadinizializza 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.

26Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 27: Sviluppare applicazioni geolocalizzate per iPhone

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.

27Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 28: Sviluppare applicazioni geolocalizzate per iPhone

Aprite FirstCLController.h Creiamo il protocollo LocatorDelegate dopo le

righe di importazione

@protocol LocatorDelegate

@required

- (void) locationUpdate:

(CLLocation *)location;

- (void) locationError:

(NSString *)error;

@end

28Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 29: Sviluppare applicazioni geolocalizzate per iPhone

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>

29Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 30: Sviluppare applicazioni geolocalizzate per iPhone

Per prima cosa aggiungete in testa @synthesize delegate;

Aprite FirstCLController.m e aggiungete dopo le righe di logging dei metodi didUpdateToLocation e didFailWithErrorrispettivamente: [self.delegate locationUpdate:newLocation];

[self.delegate locationError:

[error description]];

30Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 31: Sviluppare applicazioni geolocalizzate per iPhone

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.

31Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 32: Sviluppare applicazioni geolocalizzate per iPhone

Entrambi i metodi del protocollo sono obbligatori.

- (void) locationUpdate:(CLLocation *)location{

[locationLabel setText:[location description]];

}

- (void) locationError:(NSString *)error{

[locationLabel setText:error];

}

32Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 33: Sviluppare applicazioni geolocalizzate per iPhone

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.

33Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 34: Sviluppare applicazioni geolocalizzate per iPhone

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

34Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 35: Sviluppare applicazioni geolocalizzate per iPhone

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.

35Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 36: Sviluppare applicazioni geolocalizzate per iPhone

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.frameworke l’import #import <MapKit/MapKit.h>

36Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 37: Sviluppare applicazioni geolocalizzate per iPhone

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.

37Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 38: Sviluppare applicazioni geolocalizzate per iPhone

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];

38Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 39: Sviluppare applicazioni geolocalizzate per iPhone

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!

39Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 40: Sviluppare applicazioni geolocalizzate per iPhone

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!40Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 41: Sviluppare applicazioni geolocalizzate per iPhone

41Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009

Page 42: Sviluppare applicazioni geolocalizzate per iPhone

Dubbi, domande?

42Eduard Roccatello @ Italian iPhone Developer Meeting24 Ottobre 2009