iPhone 3 beta 5: è ora di darsi da fare
by Michele
Non sono riuscito a resistere e il giorno stesso in cui veniva rilasciata la prima beta dell nuovo iPhone 3.0 l’ho installata! I primo periodo è stato problematico per via della stabilità, queste ultime versioni, in particolare la beta 5 sono molto stabili. Tra l’altro la beta 5 è un punto di svolta: da qui in avanti non verranno accettate applicazioni che non siano anche compatibili con la versione 3.0 del firmware.
Ieri ho scaricato l’ultima versione del SDK 3.0 e ho provato a vedere se la mia vecchia applicazione Nomictionary fosse compatibile. Ad un primo test sembra compatibile, comunque avevo già in mente di modificarla, rinnovando l’aspetto grafico e togliendo i riferimenti a tutto ciò che è stato deprecato nella 3.0.
Ho provato anche a fare una piccola applicazione di prova che sfrutta la localizzazione. Devo ammettere che lo sviluppo pr iPhone è molto più semplice di quello che sembra. Ho scritto un’applicazione che mostra le coordinate sullo schermo e il punto sulla mappa in un’oretta cercamdo esempi e documentazione sull’utilizzo di CoreLocation e MapKit. Il primo è il framework che permette di agganciarsi al servizio di localizzazione di iPhone. Servizio che funziona sia con la triangolazione delle celle della rete sia con il modulo GPS integrato. La seconda libreria permette di utilizzare il widget di Goolge Map che mostra una mappa ibrida con un marker rosso nel punto delle coordinate.
Il risultato è questo:

Ed ecco un po di codice su come si usa CoreLocation:
Si importa l’header della libreria :
#import <CoreLocation/CoreLocation.h>
Si definisce l’oggetto a livello di istanza della classe che lo utilizzerà, in questo casi uso una sola classe per praticamente tutto: delego alla classe la gestione dell’applicazione, il CoreLocation e il widget di Google Maps:
@interface MyLocationAppDelegate : NSObject
<UIApplicationDelegate, CLLocationManagerDelegate, MKMapViewDelegate> { CLLocationManager *locationManager; }
Alla partenza dell’applicazione inizializzo il location manager con una precisione di decine di metri e gli setto il delegate alla mia classe principale MyLocationAppDelegate. NB: questo oggetto è stato allocato da me e quindi spetta a me deallocarlo nel momento in cui non lo utilizzerò più:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
locationManager = [[CLLocationManager alloc] init];
[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
[locationManager setDelegate:self];
}
Faccio partire il location manager con l’aggiornamento della location:
[locationManager startUpdatingLocation];
A questo punto devo dichiarare il metodi che mi obbliga il protocol: CLLocationManagerDelegate:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
// notifica di cambio location con successo
// prendo le coordinate dall'oggetto newLocation:
CLLocationCoordinate2D coordinate = [newLocation coordinate];
// dichiaro un oggetto formatter per formattare i numeri a virgola mobile
static NSNumberFormatter *numberFormatter;
if (numberFormatter == nil) {
numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMaximumFractionDigits:10];
}
NSString *latitudine = [numberFormatter stringFromNumber:
[NSNumber numberWithDouble:coordinate.latitude]]];
NSString *longitudine = [numberFormatter stringFromNumber:
[NSNumber numberWithDouble:coordinate.longitude]]];
}
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error {
// notifica di cambio location con errori
}
Mi devo ricordare di deallocare il location manager:
- (void)dealloc {
[locationManager release];
[super dealloc];
}
Ovviamente ho tralasciato parecchie righe ma questi pezzi di codice servono solo a dare un’idea di come si utilizza il CoreLocation. Ci sono parecchie librerie interessanti nell’SDK di iPhone e probabilmente presto pubblicherò qualche altro esempio.