Curs de programació d ’ iOS

23
Curs de programació d’iOS Novembre de 2011 Organitza

description

Curs de programació d ’ iOS. Novembre de 2011. Organitza. 11 L ocalització i mapes ( CoreLocation i MapKit ). La localització permet que les aplicacions puguin determinar la ubicació geogràfica del dispositiu . - PowerPoint PPT Presentation

Transcript of Curs de programació d ’ iOS

Page 1: Curs de programació d ’ iOS

Curs de programació d’iOSNovembre de 2011

Organitza

Page 2: Curs de programació d ’ iOS

11 Localització i mapes (CoreLocation i MapKit)

• La localització permet que les aplicacions puguin determinar la ubicació geogràfica del dispositiu.

• L’SDK proporciona el framework CoreLocation per obtenir les dades del GPS i la brúixola del disposotiu.

• L’SDK empra els mapes de Google Maps però per manipular-los proporciona el framework MapKit.

Page 3: Curs de programació d ’ iOS

CoreLocation

• La classe que fa d’interfície amb el hardware (GPS i brúixola) s’anomena CLLocationManager

• CLLocationManager 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 interfície gràfica.

• Per treballar amb la classe CLLocationManager cal assignar-li un delegat que implementi CLLocationManagerDelegate

Page 4: Curs de programació d ’ iOS

CoreLocation

#import <UIKit/UIKit.h>#import <CoreLocation/CoreLocation.h>

@interface ExempleAppDelegate : NSObject <UIApplicationDelegate, CLLocationManagerDelegate>{

UIWindow *window;CLLocationManager *locationManager;

}@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

• ExempleAppDelegate.h

Page 5: Curs de programació d ’ iOS

CoreLocation

• Una instància de CLLocationManager 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 dispositiu ha de recórrer per tal que CLLocationManager informi al seu delegat d’una nova coordenada.

[locationManager setDistanceFilter:kCLDistanceFilterNone];

Page 6: Curs de programació d ’ iOS

CoreLocation

• La propietat desiredAccuracy defineix el grau de precisió dels resultats que entrega el dispositiu a l’aplicació. CLLocationManager només entregarà la coordenada si aquesta compleix la precisió indicada.

[locationManager setDistanceFilter:kCLLocationAccuracyHundredMeters];

Page 7: Curs de programació d ’ iOS

CoreLocation- (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions{

// Crear l’objecte location managerlocationManager = [[CLLocationManager alloc] init];

// Assignar el delegate[locationManager setDelegate:self];

// Volem tots els resultats de location manager[locationManager setDistanceFilter:kCLDistanceFilterNone];

// Volem els resultats amb la màxima precisió possible[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

// S’indica que ja pot començar a capturar les coordenades del GPS[locationManager startUpdatingLocation];

[window makeKeyAndVisisble];return YES;

}

Page 8: Curs de programació d ’ iOS

CoreLocation

• Quan una instància de CLLocationManager compta amb suficients dades per informar d’una nova coordenada, genera una instància de CLLocation

• CLLocation s’envia al delegat de CLLocationManager mitjançant el mètode delegat locationManager:didUpdateToLocation:fromLocation

Page 9: Curs de programació d ’ iOS

CoreLocation

horizontalAccuracy = 1000

CLLocation

CLLocationCoordinate2D

Latitude = 41.739031Longitude = 1.847071

Page 10: Curs de programació d ’ iOS

CoreLocation

- (void)locationManager: (CLLocationManager *)manager didUpdateToLocation: (CLLocation *)newLocation fromLocation: (CLLocation *)oldLocation{

NSLog(@“Nova posició: %f / %f", [newLocation coordinate].latitude, [newLocation coordinate].longitude);}

• Capturar la nova coordenada del GPS

- (void)locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error{

NSLog(@”No es poden obtenir coordenades: %@”, error);}

• Capturar errors durant la geolocalització

[locationManager stopUpdatingLocation];

• Capturar errors durant la geolocalització

Page 11: Curs de programació d ’ iOS

MapKit

• MapKit és el framework que permet mostrar mapes amb informació geogràfica.

Page 12: Curs de programació d ’ iOS

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

Page 13: Curs de programació d ’ iOS

MapKit

• MKMapView pot ser de tres tipus:

MKMapTypeStandard MKMapTypeSatellite MKMapTypeHybrid

Page 14: Curs de programació d ’ iOS

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 action:@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; }

}

Page 15: Curs de programació d ’ iOS

MapKit• Podem definir una regió en un MKMapView. La regió defineix l’àrea

geogràfica que volem que mostri el mapa a partir d’una coordenada.

#import <MapKit/MapKit.h>

mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)];mapView.mapType = MKMapTypeStandard;mapView.showsUserLocation=TRUE;mapView.delegate = self;mapView.scrollEnabled = YES;mapView.zoomEnabled = YES;[self.view addSubview:mapView];

MKCoordinateRegion region;MKCoordinateSpan span;span.latitudeDelta=0.2;span.longitudeDelta=0.2;

CLLocationCoordinate2D location=mapView.userLocation.coordinate;region.span=span;region.center=location;[mapView setRegion:region animated:TRUE];[mapView regionThatFits:region];

Page 16: Curs de programació d ’ iOS

MapKit – Etiquetatge de localitzacions• En un MKMapView hi podem afegir anotacions emprant classes que

implementin el protocol MKAnnotation

Page 17: Curs de programació d ’ iOS

MapKit – Etiquetatge de localitzacions• Primer hem de crear i definir una classe NSObject que implementi el

protocol MKAnnotation

#import <Foundation/Foundation.h>#import <CoreLocation/CoreLocation.h>#import <MapKit/MapKit.h>

@interface MapPoint : NSObject <MKAnnotation>{

NSString *title;CLLocationCoordinate2D coordinate;

}

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;@property (nonatomic, copy) NSString *title;

- (id) initWithCoordinate: (CLLocationCoordinate2D)c title: (NSString *)t;

@end

MapPoint.h

Page 18: Curs de programació d ’ iOS

#import “MapPoint.h”

@implementation MapPoint@synthesize coordinate, title;

- (id)initWithCoordinate: (CLLocationCoordinate2D)c title: (NSString *)t{

self = [super init];coordinate = c;[self setTitle:t];

return self;}

- (void)dealloc{

[title release];[super dealloc];

}@end

MapPoint.m

MapKit – Etiquetatge de localitzacions

Page 19: Curs de programació d ’ iOS

MapKit – Etiquetatge de localitzacions• Afegir anotacions a un MKMapView

CLLocationCoordinate2D coordenada;coordenada.latitude = 41.739031;coordenada.longitude = 1.847071;

MapPoint *mp = [[MapPoint alloc] initWithCoordinate:coordenada title:@”CATIC”];[mapView addAnnotation:mp];[mp release];

• Eliminar anotacions d’un MKMapView[mapView removeAnnotations:[mapView annotations]];

• Centrar automàticament les anotacions quan s’afegeixen- (void)mapView: (MKMapView *)mv didAddAnnotationViews: (NSArray *)views{

MKAnnotationView *annotationView = [views objectAtIndex:0];id <MKAnnotation> mp = [annotationView annotation];MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 250, 250);[mv setRegion:region animated:YES];

}

Page 20: Curs de programació d ’ iOS

12 Persistència de dades

• Preferències de l’usuari (NSUserDefaults)

• Base de dades SQL (SQLite)

Page 21: Curs de programació d ’ iOS

• La classe NSUserDefaults permet afegir/obtenir les preferències de l’usuari a l’aplicació.

• Tamany del text• Gestió de contrassenyes • Username de l’anterior sessió• Llistes d’items favorits• etc...

• Aquestes dades es perden quan s’elimina l’aplicació del terminal.

NSUserDefaults

Page 22: Curs de programació d ’ iOS

NSUserDefaults

• Les preferències d’usuari de les aplicacions es guarden a la carpeta Settings.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ó.

Page 23: Curs de programació d ’ iOS

NSUserDefaults

• Afegir una preferència d’usuari al diccionari:NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults setObject:@”[email protected]” 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”];