2. PROGRAMMA DI OGGI
Esempi 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
5. 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.
6. DATI PERSISTENTI: IMPOSTAZIONI APPLICAZIONE
Una volta impostato il Settings.bundle e il
root.plist.
Si potrà accedere ai dati conservati con il
seguente snippet:
NSUserDefaults *defaults =
[NSUserDefaults standardUserDefaults];
[self setShouldPlaySounds:
[defaults boolForKey:@"miaPreferenza"]];
8. 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 creato
5.Accedere ai dati e gestirli dalla vostra APP
9. DATI PERSISTENTI: SQLLITE
Creare 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
10. DATI PERSISTENTI: SQLLITE
Creare una classe di accesso ai Dati (dati.m)
#import "Data.h"
static sqlite3 *database = nil;
@implementation Data
@synthesize lista;
// Inizializziamo l'oggetto 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
11. DATI PERSISTENTI: SQLLITE
Creare 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");
}
12. DATI PERSISTENTI: SQLLITE
E ora accediamo ai nostri dati da una qualsiasi classe
dell’Applicazione:
//leggiamo il path del database
! NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"persone.sqlite"];
!
! //creiamo la lista degli autori
! dataList = [[Data alloc] init:defaultDBPath];
14. DATI PERSISTENTI: LAVORARE SUI FILES
L’ultimo metodo per la gestione dei dati all’interno della vostra
APP è 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).
15. DATI PERSISTENTI: LAVORARE SUI FILES
Salvare 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];
19. LEGGERE DATI DALLA RETE
Il massimo delle potenzialità un’app le raggiunge quanto può
connettersi al web ed acquisire dati direttamente da servizi
esterni come per esempio attraverso i file XML.
Esistono vari framework per ottenere dati dal web (es
ASIHTTPREQUEST) ma la più semplice prevede l’utilizzo di
questo 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 dati
da un NSString contenente XML
20. LEGGERE DATI DALLA RETE: UN SEMPLICE PARSER XML (DA STRINGA)
Interfaccia
#import <Foundation/Foundation.h>
@interface XmlServer : NSObject <NSXMLParserDelegate>{
}
//Creiamo un singleton:
+ (id)sharedXmlServer;
29. CONCETTI: DEBUG DELLE APPLICAZIONI
Le nostre applicazioni prima di poter essere distribuite dovranno
essere testate. In tal senso grazie ad Xcode e alla programmazione
Xcode possiamo mettere in atto le nostre tecniche di analisi e
verifica delle applicazioni che dovranno rispecchiare uno schema
simile 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 test
potranno passare alla fase finale di testing e successivamente alla
pubblicazione sull’AppleStore
30. CONCETTI: DEBUG DELLE APPLICAZIONI
Durante le fasi di testing, la nostra console di Xcode ci informerà di tutti gli eventi
dell’Applicazione attraverso due tecniche:
•Breakpoint
•NSLog(@”Messagio in console”)
Inoltre potremo attivare la modalità debug (NSZombie) attraverso il menu: Product->Edit
Scheme->Diagnostics (come in figura seguente)
33. CONCETTI: DISTRIBUIRE LE APP
Una volta che le nostre applicazioni sono pronte per il
pubblico (o per il cliente) si dovrà procedere alla
“distribuzione”. Per fare ciò vi necessita il certificato di
Distribuzione (ottenibile attraverso l’IOS Provisioning
Profile) e i “mobileProvisioning” certificate.
Esistono 2 tipologie principali di pubblicazione:
•Ad-Hoc
•AppStore
34. CONCETTI: DISTRIBUIRE LE APP
•La distribuzione ad-hoc: serve per inviare la vostra
applicazione ad una cerchia ristretta di persone (Es. i
vostri amici per fare dei test o il vostro cliente per
l’approvazione).
•La distribuzione AppStore: è l’invio definitivo della
vostra app verso lo store mondiale di apple. in questo
caso la vostra applicazione sarà sottoposta a una
revisione da parte dei tecnici apple e se riceverete esito
positivo potrete vedere e scaricare la vostra app
direttamente dall’AppleStore.
35. CONCETTI: DISTRIBUZIONE AD-HOC
Per creare una distribuzione Ad-Hoc, vi servirà un certificato di distribuzione
e un MobileProvisioning per la distribuzione AdHoc con allegati i device
mobile (iphone,ipad, ipod) che potranno fare funzionare la vostra app.
Per creare il certificato, aggiungere i device e scaricare il mobile provisioning
dovrete visitare l’IOS provisioning portal (http://developer.apple.com) e
seguire le semplici istruzioni di apple.
1.Per creare la IPA da inviare ai “tester” dovrete
seguire tre semplici passaggi:
2. Duplicare la configurazione “release” e rinominarla
AdHoc-Distrib
3. Variare il certificato di firma con il nuovo
certificato per la distribuzione ad-hoc.
4. Generare l’Archivio.
36. CONCETTI: DISTRIBUZIONE AD-HOC
Una volta generato l’archivio, potrete accedere
alla vostra “IPA” direttamente dall’organizer.
1.Cliccare su Share
2. Salvare su Disco la vostra “IPA”
3. Inviarla per Email insieme al MobileProvisioning (distribuzione)
4. Attendere i feeback!
37. CONCETTI: DISTRIBUZIONE AD-HOC
Per distribuire sull’Appstore, vi servirà un certificato di distribuzione
e un MobileProvisioning per la distribuzione AppStore inoltre
dovrete aver testato la vostra applicazione e predisposto
sull’ItunesConnect un’app con lo stesso nome, la stessa versione e
tutte le icone e screenshot necessari che accoglierà la vostra app.
1.Creare l’app su Apple-ItunesConnect
2. Inserire tutte le icone, screenshot e descrizioni
3. Scaricare il certificato di Distribuzione AppStore
4. compilare l’Archivio con il certificato AppStore
(come in passaggi Ad-Hoc)
5.Dall’organizer fare “submit” del pacchetto generato
6.Attendere i feedback da parte di apple
40. per informazioni FLT.lab
http://www.fltlab.net
info@fltlab.net
GRAZIE PER L’ATTENZIONE
Visitate 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