Curs de programació d’iOS Novembre de 2011
Organitza
11 Localització i mapes (CoreLoca>on i MapKit) • La localització permet que les aplicacions puguin determinar la ubicació geogràfica del disposi9u. • L’SDK proporciona el framework CoreLoca>on per obtenir les dades del GPS i la brúixola del disposo9u. • L’SDK empra els mapes de Google Maps però per manipular-‐los proporciona el framework MapKit.
CoreLoca>on • La classe que fa d’interHcie amb el hardware (GPS i brúixola) s’anomena CLLoca>onManager • CLLoca>onManager treballa en segon pla mentre la resta de l’aplicació es dedica a altres tasques com rebre la interacció de l’usuari i refrescar la interHcie gràfica. • Per treballar amb la classe CLLoca>onManager cal assignar-‐li un delegat que implemen9 CLLoca>onManagerDelegate
CoreLoca>on • ExempleAppDelegate.h #import <UIKit/UIKit.h> #import <CoreLoca9on/CoreLoca9on.h> @interface ExempleAppDelegate : NSObject <UIApplica9onDelegate, CLLoca>onManagerDelegate> { UIWindow *window; CLLoca>onManager *loca>onManager; } @property (nonatomic, retain) IBOutlet UIWindow *window; @end
CoreLoca>on • Una instància de CLLoca>onManager té propietats que podem configurar per concretar la seva freqüència d’actualització i el seu grau de precisió. • La propietat distanceFilter fixa la distància, en metres, que el disposi9u ha de recórrer per tal que CLLoca>onManager informi al seu delegat d’una nova coordenada. [loca9onManager setDistanceFilter:kCLDistanceFilterNone];
CoreLoca>on • La propietat desiredAccuracy defineix el grau de precisió dels resultats que entrega el disposi9u a l’aplicació. CLLoca>onManager només entregarà la coordenada si aquesta compleix la precisió indicada.
[loca9onManager setDistanceFilter:kCLLoca9onAccuracyHundredMeters];
CoreLoca>on -‐ (BOOL)applica9on: (UIApplica9on *)applica9on didFinishLaunchingWithOp9ons: (NSDic9onary *) launchOp9ons { // Crear l’objecte loca9on manager loca9onManager = [[CLLoca9onManager alloc] init]; // Assignar el delegate [loca9onManager setDelegate:self]; // Volem tots els resultats de loca9on manager [loca9onManager setDistanceFilter:kCLDistanceFilterNone]; // Volem els resultats amb la màxima precisió possible [loca9onManager setDesiredAccuracy:kCLLoca9onAccuracyBest]; // S’indica que ja pot començar a capturar les coordenades del GPS [loca9onManager startUpda9ngLoca9on]; [window makeKeyAndVisisble]; return YES; }
CoreLoca>on • Quan una instància de CLLoca>onManager compta amb suficients dades per informar d’una nova coordenada, genera una instància de CLLoca>on • CLLoca>on s’envia al delegat de CLLoca>onManager mitjançant el mètode delegat loca>onManager:didUpdateToLoca>on:fromLoca>o n
CoreLoca>on CLLoca>on horizontalAccuracy = 1000
CLLoca>onCoordinate2D La9tude = 41.739031 Longitude = 1.847071
CoreLoca>on • Capturar la nova coordenada del GPS -‐ (void)loca9onManager: (CLLoca9onManager *)manager didUpdateToLoca9on: (CLLoca9on *) newLoca9on fromLoca9on: (CLLoca9on *)oldLoca9on { NSLog(@“Nova posició: %f / %f", [newLoca9on coordinate].la9tude, [newLoca9on coordinate].longitude); }
• Capturar errors durant la geolocalització -‐ (void)loca9onManager: (CLLoca9onManager *)manager didFailWithError: (NSError *)error { NSLog(@”No es poden obtenir coordenades: %@”, error); }
• Capturar errors durant la geolocalització [loca9onManager stopUpda9ngLoca9on];
MapKit • MapKit és el framework que permet mostrar mapes amb informació geogràfica.
MapKit • MapKit és el framework que permet mostrar mapes amb informació geogràfica. • La classe MKMapView és l’encarregada de mostrar mapes, capturar-‐ne els tocs i gestos de l’usuari, i mostrar-‐hi anotacions. • Per capturar les operacions que es fan sobre el mapa hem d’implementar el protocol MKMapViewDelegate
MapKit • MKMapView pot ser de tres 9pus: MKMapTypeStandard MKMapTypeSatellite MKMapTypeHybrid
Exemple 11 #import <MapKit/MapKit.h> mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)]; mapView.mapType = MKMapTypeStandard; mapView.delegate = self; mapView.scrollEnabled = YES; mapView.zoomEnabled = YES; [self.view addSubview:mapView]; mapType = [[UISegmentedControl alloc] initWithItems: [NSArray arrayWithObjects:@”Mapa”, @”Satèl·∙lit”, @”Híbrid”, nil]]; [mapType setSelectedSegmentIndex:0]; [mapType addTarget:self ac9on:@selector(changeType:) forControlEvents:UIControlEventValueChanged]; mapType.frame = CGRectMake(115, 328, 195, 30); mapType.segmentedControlStyle = UISegmentedControlStyleBar; [mapType setTintColor:[UIColor lightGrayColor]]; [self.view addSubview:mapType]; -‐ (void)changeType: (id)sender { if(mapType.selectedSegmentIndex==0) { mapView.mapType=MKMapTypeStandard; } else if (mapType.selectedSegmentIndex==1) { mapView.mapType=MKMapTypeSatellite; } else if (mapType.selectedSegmentIndex==2) { mapView.mapType=MKMapTypeHybrid; } }
MapKit • Podem definir una regió en un MKMapView. La regió defineix l’àrea geogràfica que volem que mostri el mapa a par9r d’una coordenada. #import <MapKit/MapKit.h> mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)]; mapView.mapType = MKMapTypeStandard; mapView.showsUserLoca9on=TRUE; mapView.delegate = self; mapView.scrollEnabled = YES; mapView.zoomEnabled = YES; [self.view addSubview:mapView];
MKCoordinateRegion region; MKCoordinateSpan span; span.la9tudeDelta=0.2; span.longitudeDelta=0.2; CLLoca9onCoordinate2D loca9on=mapView.userLoca9on.coordinate; region.span=span; region.center=loca9on; [mapView setRegion:region animated:TRUE]; [mapView regionThatFits:region];
MapKit – E>quetatge de localitzacions • En un MKMapView hi podem afegir anotacions emprant classes que implemen9n el protocol MKAnnota>on
MapKit – E>quetatge de localitzacions • Primer hem de crear i definir una classe NSObject que implemen9 el protocol MKAnnota>on MapPoint.h #import <Founda9on/Founda9on.h> #import <CoreLoca9on/CoreLoca9on.h> #import <MapKit/MapKit.h> @interface MapPoint : NSObject <MKAnnota9on> { NSString *9tle; CLLoca9onCoordinate2D coordinate; } @property (nonatomic, readonly) CLLoca9onCoordinate2D coordinate; @property (nonatomic, copy) NSString *9tle; -‐ (id) initWithCoordinate: (CLLoca9onCoordinate2D)c 9tle: (NSString *)t; @end
MapKit – E>quetatge de localitzacions MapPoint.m #import “MapPoint.h” @implementa9on MapPoint @synthesize coordinate, 9tle; -‐ (id)initWithCoordinate: (CLLoca9onCoordinate2D)c 9tle: (NSString *)t { self = [super init]; coordinate = c; [self setTitle:t]; return self; } -‐ (void)dealloc { [9tle release]; [super dealloc]; } @end
MapKit – E>quetatge de localitzacions • Afegir anotacions a un MKMapView CLLoca9onCoordinate2D coordenada; coordenada.la9tude = 41.739031; coordenada.longitude = 1.847071; MapPoint *mp = [[MapPoint alloc] initWithCoordinate:coordenada 9tle:@”CATIC”]; [mapView addAnnota9on:mp]; [mp release];
• Eliminar anotacions d’un MKMapView [mapView removeAnnota9ons:[mapView annota9ons]];
• Centrar automà9cament les anotacions quan s’afegeixen -‐ (void)mapView: (MKMapView *)mv didAddAnnota9onViews: (NSArray *)views { MKAnnota9onView *annota9onView = [views objectAtIndex:0]; id <MKAnnota9on> mp = [annota9onView annota9on]; MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 250, 250); [mv setRegion:region animated:YES]; }
12 Persistència de dades • Preferències de l’usuari (NSUserDefaults) • Base de dades SQL (SQLite)
NSUserDefaults • La classe NSUserDefaults permet afegir/obtenir les preferències de l’usuari a l’aplicació. • Tamany del text • Ges9ó de contrassenyes • Username de l’anterior sessió • Llistes d’items favorits • etc... • Aquestes dades es perden quan s’elimina l’aplicació del terminal.
NSUserDefaults • Les preferències d’usuari de les aplicacions es guarden a la carpeta SeXngs.bundle de l’aplicació. • Aquesta carpeta ha de contenir el fitxer Root.plist on hi definirem parelles de clau-‐valor amb valors per defecte de l’aplicació.
NSUserDefaults • Afegir una preferència d’usuari al diccionari: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:@”anadalg@gmail.com” forKey:@”username”]; [defaults setObject:@”3758nci56v456v545vg” forKey:@”passwd_xifrat”]; [defaults synchronize];
• Obtenir una preferència d’usuari del diccionari: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *username = [defaults objectForKey:@”username”]; NSString *passwd = [defaults objectForKey:@”passwd_xifrat”];