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
martedì 18 ottobre 2011
3. DATI PERSISTENTI
• Impostazioni Applicazioni
• supporto SQLlite
• Lettura Scrittura Files
martedì 18 ottobre 2011
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.
martedì 18 ottobre 2011
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"]];
martedì 18 ottobre 2011
7. SQLLITE - USARE IL DATABASE
Dati Persistenti
martedì 18 ottobre 2011
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
martedì 18 ottobre 2011
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
martedì 18 ottobre 2011
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
martedì 18 ottobre 2011
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");
}
martedì 18 ottobre 2011
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];
martedì 18 ottobre 2011
13. LAVORARE CON I FILES
Dati Persistenti
martedì 18 ottobre 2011
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).
martedì 18 ottobre 2011
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];
martedì 18 ottobre 2011
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
martedì 18 ottobre 2011
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;
martedì 18 ottobre 2011
28. DEBUG E TEST DELLE APPS
Concetti
martedì 18 ottobre 2011
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
martedì 18 ottobre 2011
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)
martedì 18 ottobre 2011
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
martedì 18 ottobre 2011
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.
martedì 18 ottobre 2011
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.
martedì 18 ottobre 2011
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!
martedì 18 ottobre 2011
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
martedì 18 ottobre 2011