curs de programació d ’ ios
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 PresentationTRANSCRIPT
![Page 1: Curs de programació d ’ iOS](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/1.jpg)
Curs de programació d’iOSNovembre de 2011
Organitza
![Page 2: Curs de programació d ’ iOS](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/2.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/3.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/4.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/5.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/6.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/7.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/8.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/9.jpg)
CoreLocation
horizontalAccuracy = 1000
CLLocation
CLLocationCoordinate2D
Latitude = 41.739031Longitude = 1.847071
![Page 10: Curs de programació d ’ iOS](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/10.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/11.jpg)
MapKit
• MapKit és el framework que permet mostrar mapes amb informació geogràfica.
![Page 12: Curs de programació d ’ iOS](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/12.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/13.jpg)
MapKit
• MKMapView pot ser de tres tipus:
MKMapTypeStandard MKMapTypeSatellite MKMapTypeHybrid
![Page 14: Curs de programació d ’ iOS](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/14.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/15.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/16.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/17.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/18.jpg)
#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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/19.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/20.jpg)
12 Persistència de dades
• Preferències de l’usuari (NSUserDefaults)
• Base de dades SQL (SQLite)
![Page 21: Curs de programació d ’ iOS](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/21.jpg)
• 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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/22.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062520/56815d05550346895dcb0550/html5/thumbnails/23.jpg)
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”];