• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Corso Iphone in 48h (parte 2)
 

Corso Iphone in 48h (parte 2)

on

  • 1,061 views

Ecco per voi le slide del corso Iphone in 48h - è molto semplice e permette di conoscere almeno le basi della programmazione IOS per Iphone e Ipad!

Ecco per voi le slide del corso Iphone in 48h - è molto semplice e permette di conoscere almeno le basi della programmazione IOS per Iphone e Ipad!

Statistics

Views

Total Views
1,061
Views on SlideShare
725
Embed Views
336

Actions

Likes
0
Downloads
0
Comments
0

4 Embeds 336

http://alitalia.noblogs.org 268
http://blog.fltlab.net 38
http://alitaliait.altervista.org 27
http://webcache.googleusercontent.com 3

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Corso Iphone in 48h (parte 2) Corso Iphone in 48h (parte 2) Presentation Transcript

  • CORSO BASE IPHONE Parte 2
  • PROGRAMMA DI OGGIEsempi di Codice • Gli strumenti per la persistenza dei dati su iOS • Interfacciamento con dati esterni (web services) • Cenni di utilizzo di Map Kit e Location APIìConcetti • Debugging e Testing delle applicazioni per iOS • Distribuzione delle applicazioni su “App Store” • Risorse utili per gli sviluppatori iOS
  • DATI PERSISTENTI• Impostazioni Applicazioni• supporto SQLlite• Lettura Scrittura Files
  • APPLICATION SETTINGS Dati Persistenti
  • DATI PERSISTENTI: IMPOSTAZIONI APPLICAZIONE Una tecnica per conservare i dati dell’utente all’interno della vostra applicazione è l’utilizzo del “Settings.bundle”, per inserirlo si dovrà fare la seguente procedura:1.Menu File > Nuovo File.2.Sotto IOS, scegliere Template: Settings Template.3.assegnare come nome: Settings.bundle.
  • DATI PERSISTENTI: IMPOSTAZIONI APPLICAZIONEUna volta impostato il Settings.bundle e ilroot.plist.Si potrà accedere ai dati conservati con ilseguente snippet:NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[self setShouldPlaySounds: [defaults boolForKey:@"miaPreferenza"]];
  • SQLLITE - USARE IL DATABASE Dati Persistenti
  • DATI PERSISTENTI: SQLLITE Un’altra tecnica per conservare dati all’interno delle vostre applicazioni IOS è l’utilizzo del supporto sqlLite, integrato nel vostro device. Per attivarlo bisogna fare i seguenti passaggi:1.Importare la libreria “libsqlite3.0.dylib”2.Definire una classe di accesso ai dati (es. Data.h/m)3.Creare un database sqlLite (con sqlLite Manager o altri tools)4.Importare il database creato5.Accedere ai dati e gestirli dalla vostra APP
  • DATI PERSISTENTI: SQLLITECreare una classe di accesso ai Dati (dati.h) #import <Foundation/Foundation.h> #import <sqlite3.h> @interface Data : NSObject { // Lista contenente i dati letti dal database NSMutableArray *lista; } - (id)init:(NSString *)pathDB; - (void)caricaValoriDaDB:(NSString *)dbPath; - (unsigned)getSize; - (id)objectAtIndex:(unsigned)theIndex; @property (nonatomic, retain) NSMutableArray *lista; @end
  • DATI PERSISTENTI: SQLLITECreare una classe di accesso ai Dati (dati.m) #import "Data.h" static sqlite3 *database = nil; @implementation Data @synthesize lista; // Inizializziamo loggetto della classe Data - (id)init:(NSString *)pathDB{ // carichiamo i valori dal database [self caricaValoriDaDB:pathDB]; return self; } +(void)finalizeStatements { if(database) sqlite3_close(database); } -(void)dealloc { [lista release]; [super dealloc]; } //..implementazione metodi di lettura... @end
  • DATI PERSISTENTI: SQLLITECreare una classe di accesso ai Dati (dati.m)- (void)caricaValoriDaDB:(NSString *)dbPath { NSLog(@"path: %@",dbPath); // lista temporanea NSMutableArray *listaTemp = [[NSMutableArray alloc] init]; // Oggetto che contiene i vari elementi NSMutableDictionary *dictionary; NSMutableString *idPersona;//id della persona NSMutableString *nome;//nome della persona NSMutableString *cognome;//cognome della persona if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { // query che ricava i valori const char *sql = "select ID, Nome, Cognome from PERSONA"; sqlite3_stmt *selectstmt; if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { while(sqlite3_step(selectstmt) == SQLITE_ROW) { // ricaviamo i valori letti dalla query idPersona = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)]; nome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]; cognome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)]; // inseriamo tutti i valori letti in un unico oggetto dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:idPersona, @"id", nome, @"nome", cognome, @"cognome", nil]; [listaTemp addObject:dictionary]; [dictionary release]; } } self.lista = listaTemp; [listaTemp release]; } else sqlite3_close(database); NSLog(@"tutto ok");}
  • DATI PERSISTENTI: SQLLITEE ora accediamo ai nostri dati da una qualsiasi classedell’Applicazione://leggiamo il path del database! NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"persone.sqlite"];!! //creiamo la lista degli autori! dataList = [[Data alloc] init:defaultDBPath];
  • LAVORARE CON I FILES Dati Persistenti
  • DATI PERSISTENTI: LAVORARE SUI FILESL’ultimo metodo per la gestione dei dati all’interno della vostraAPP è quello che permette la lettura e la scrittura dei files.Gli usi sono molteplici, dalla possibilità di inserire informazioni,fino alla possibilità di conservare immagini scaricate (caching).
  • DATI PERSISTENTI: LAVORARE SUI FILESSalvare un NSArray in un file:NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);NSString *documentsDirectory = [paths objectAtIndex:0];NSString *filePath = [documentsDirectory stringByAppendingPathComponent:FILE_NAME];[myArray writeToFile:filePath atomically:TRUE];Leggere un NSArray da un file: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:FILE_NAME]; myArray = [NSArray arrayWithContentsOfFile:filePath];
  • DATI PERSISTENTI: LAVORARE SUI FILESVerificare se il file Esiste e salvare un immagine: if(![[NSFileManager defaultManager] fileExistsAtPath: uniquePath]) { NSData *data = [[NSData alloc] initWithContentsOfURL: ImageURL]; UIImage *image = [[UIImage alloc] initWithData: data]; image = [self roundCorners: image]; if([ImageURLString rangeOfString: @".png" options:NSCaseInsensitiveSearch].location != NSNotFound) { [UIImagePNGRepresentation(image) writeToFile: uniquePath atomically: YES]; } else if( [ImageURLString rangeOfString: @".jpg" options:NSCaseInsensitiveSearch].location != NSNotFound || [ImageURLString rangeOfString: @".jpeg" options:NSCaseInsensitiveSearch].location != NSNotFound ) { [UIImageJPEGRepresentation(image, 100) writeToFile: uniquePath atomically:YES]; } }
  • DATI PERSISTENTI: LAVORARE SUI FILESLeggere un immagine da un file:- (UIImage *) getCachedImage: (NSString *) ImageURLString{ NSString *filename = [[something unique, perhaps the image name]]; NSString *uniquePath = [TMP stringByAppendingPathComponent: filename]; UIImage *image; if([[NSFileManager defaultManager] fileExistsAtPath: uniquePath]) { image = [UIImage imageWithContentsOfFile: uniquePath]; // this is the cachedimage } else { [self cacheImage: ImageURLString]; image = [UIImage imageWithContentsOfFile: uniquePath]; } return image;}
  • LEGGERE DATI DALLA RETE Dati Persistenti
  • LEGGERE DATI DALLA RETEIl massimo delle potenzialità un’app le raggiunge quanto puòconnettersi al web ed acquisire dati direttamente da serviziesterni come per esempio attraverso i file XML.Esistono vari framework per ottenere dati dal web (esASIHTTPREQUEST) ma la più semplice prevede l’utilizzo diquesto snippet: NSURL *URL=[[NSURL alloc] initWithString:stringForURL]; NSString *results = [[NSString alloc] initWithContentsOfURL :URL];e l’utilizzo di una classe “parser” che prepari un elenco di datida un NSString contenente XML
  • LEGGERE DATI DALLA RETE: UN SEMPLICE PARSER XML (DA STRINGA) Interfaccia#import <Foundation/Foundation.h>@interface XmlServer : NSObject <NSXMLParserDelegate>{}//Creiamo un singleton:+ (id)sharedXmlServer;
  • LEGGERE DATI DALLA RETE Implementazione#import <Foundation/Foundation.h>#import <Foundation/NSXMLParser.h>- (void)parserDidStartDocument:(NSXMLParser *)parser{!! NSLog(@"found file and started parsing");}- (id)parseXMLFileForString:(NSString *)xmlString{!! NSData *rssXmlData = [rssXmlString dataUsingEncoding: NSUTF8StringEncoding];! NSXMLParser *rssParser = [[NSXMLParser alloc] initWithData:MYDATA]; [rssParser setDelegate:self];! [rssParser setShouldProcessNamespaces:NO];! [rssParser setShouldReportNamespacePrefixes:NO];! [rssParser setShouldResolveExternalEntities:NO];! [rssParser parse];! [rssParser release];}- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{!! ! NSLog(@"found this element: %@", elementName);}- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName{}- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{}- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {! NSString * errorString = [NSString stringWithFormat:@"Unable parse XML error number:%i )", [parseError code]];! NSLog(@"Errore Analisi XML: %@,", errorString, [parseError description]);!}
  • INTRODUZIONE AL MAPKIT Strumenti Avanzati
  • MAPKITUtilizziamo il MapKit di IOSSetup (frameworks): #ifdef __OBJC__ #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> #endifAggiungiamo i delegati: @interface MapViewController : UIViewController <MKMapViewDelegate>   @end
  • MAPKITInseriamo la Mappa nella nostra View: - (void)loadView { self.title = @"Mappa"; MKMapView *map= [[[MKMapView alloc] init] autorelease]; map.delegate = self; map.showsUserLocation = YES; self.view = map; }Zoommiamo sulla posizione dell’utente - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { for (MKAnnotationView *annotationView in views) { if (annotationView.annotation == mapView.userLocation) { MKCoordinateSpan span = MKCoordinateSpanMake(0.3, 0.3); MKCoordinateRegion region = MKCoordinateRegionMake(mapView.userLocation.coordinate, span); [mapView setRegion:region animated:YES]; } } }
  • MAPKITAggiungere pushpin - la classe Annotation @interface MobileSchoolAnnotation : NSObject <MKAnnotation> { " CLLocationCoordinate2D coordinate; }   @end #import "MobileSchoolAnnotation.h"   @implementation MobileSchoolAnnotation   - (id)init { coordinate.longitude = -122.084095; coordinate.latitude = 37.422006; return [super init]; } @synthesize coordinate; - (NSString *)title { return @"MobileSchool"; } - (NSString *)subtitle { return @"Corso IOS!"; } @end
  • MAPKITAggiungere i pushpin alla nostra Mappa [map addAnnotation:[[[MobileSchoolAnnotation alloc] init] autorelease]];Usare i delegati per personalizzare il click sui pushpin: - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation { if (annotation == mapView.userLocation) { return nil; } MKPinAnnotationView *pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease]; pinView.pinColor = MKPinAnnotationColorPurple; pinView.canShowCallout = YES; pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; pinView.animatesDrop = YES; return pinView; } - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped: (UIControl *)control { " [self.navigationController pushViewController:[[[UIViewController alloc] init] autorelease] animated:YES]; }
  • MAPKIT TIPSCreare viste personalizzate per i nostri PushPin - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if (annotation == mapView.userLocation) { return nil; } MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease]; annotationView.image = [UIImage imageNamed:@"google.png"]; annotationView.canShowCallout = YES; annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; return annotationView; }
  • DEBUG E TEST DELLE APPS Concetti
  • CONCETTI: DEBUG DELLE APPLICAZIONILe nostre applicazioni prima di poter essere distribuite dovrannoessere testate. In tal senso grazie ad Xcode e alla programmazioneXcode possiamo mettere in atto le nostre tecniche di analisi everifica delle applicazioni che dovranno rispecchiare uno schemasimile al seguente per ciascuna delle feature da noi inserite: •Verifica funzionale su simulatore •Verifica funzionale su terminale •Casi Limite (es. verifica input utente/problemi di rete etc.)Le nostre app se risponderanno positivamente a tutti i testpotranno passare alla fase finale di testing e successivamente allapubblicazione sull’AppleStore
  • CONCETTI: DEBUG DELLE APPLICAZIONIDurante le fasi di testing, la nostra console di Xcode ci informerà di tutti gli eventidell’Applicazione attraverso due tecniche:•Breakpoint•NSLog(@”Messagio in console”)Inoltre potremo attivare la modalità debug (NSZombie) attraverso il menu: Product->EditScheme->Diagnostics (come in figura seguente)
  • ABILITARE L’NSZOMBIE Debug
  • DISTRIBUZIONE Concetti
  • CONCETTI: DISTRIBUIRE LE APPUna volta che le nostre applicazioni sono pronte per ilpubblico (o per il cliente) si dovrà procedere alla“distribuzione”. Per fare ciò vi necessita il certificato diDistribuzione (ottenibile attraverso l’IOS ProvisioningProfile) e i “mobileProvisioning” certificate.Esistono 2 tipologie principali di pubblicazione:•Ad-Hoc•AppStore
  • CONCETTI: DISTRIBUIRE LE APP•La distribuzione ad-hoc: serve per inviare la vostraapplicazione ad una cerchia ristretta di persone (Es. ivostri amici per fare dei test o il vostro cliente perl’approvazione).•La distribuzione AppStore: è l’invio definitivo dellavostra app verso lo store mondiale di apple. in questocaso la vostra applicazione sarà sottoposta a unarevisione da parte dei tecnici apple e se riceverete esitopositivo potrete vedere e scaricare la vostra appdirettamente dall’AppleStore.
  • CONCETTI: DISTRIBUZIONE AD-HOCPer creare una distribuzione Ad-Hoc, vi servirà un certificato di distribuzionee un MobileProvisioning per la distribuzione AdHoc con allegati i devicemobile (iphone,ipad, ipod) che potranno fare funzionare la vostra app.Per creare il certificato, aggiungere i device e scaricare il mobile provisioningdovrete visitare l’IOS provisioning portal (http://developer.apple.com) eseguire le semplici istruzioni di apple.1.Per creare la IPA da inviare ai “tester” dovreteseguire tre semplici passaggi:2. Duplicare la configurazione “release” e rinominarlaAdHoc-Distrib3. Variare il certificato di firma con il nuovocertificato per la distribuzione ad-hoc.4. Generare l’Archivio.
  • CONCETTI: DISTRIBUZIONE AD-HOCUna volta generato l’archivio, potrete accederealla vostra “IPA” direttamente dall’organizer.1.Cliccare su Share2. Salvare su Disco la vostra “IPA”3. Inviarla per Email insieme al MobileProvisioning (distribuzione)4. Attendere i feeback!
  • CONCETTI: DISTRIBUZIONE AD-HOCPer distribuire sull’Appstore, vi servirà un certificato di distribuzionee un MobileProvisioning per la distribuzione AppStore inoltredovrete aver testato la vostra applicazione e predispostosull’ItunesConnect un’app con lo stesso nome, la stessa versione etutte le icone e screenshot necessari che accoglierà la vostra app.1.Creare l’app su Apple-ItunesConnect2. Inserire tutte le icone, screenshot e descrizioni3. Scaricare il certificato di Distribuzione AppStore4. compilare l’Archivio con il certificato AppStore(come in passaggi Ad-Hoc)5.Dall’organizer fare “submit” del pacchetto generato6.Attendere i feedback da parte di apple
  • RISORSE UTILI Concetti
  • CONCETTI: RISORSE UTILI•MobileSchool: http://www.mobileschool.it•StackOverflow: http://stackoverflow.com/•Ios Develper library: http://developer.apple.com/library/ios/navigation/#section=Resource%20Types&topic=Guides•Itunes Connect: https://itunesconnect.apple.com/•IPhone Dev Book: www.iphonedevbook.com/•IphoneDeveloper tips: http://iphonedevelopertips.com/
  • per informazioni FLT.lab http://www.fltlab.net info@fltlab.net GRAZIE PER L’ATTENZIONEVisitate mobileschool.it per scaricare le demo delle applicazioni realizzate durante il corso! MobileSchool è un progetto realizzato in collaborazione con Figmenta S.r.l. - copyright 2012 Figmenta