2. JSON
JSON (JavaScript Object Notation) 竪 un protocollo molto
leggero per scambio dinformazioni
basato su un sottoinsieme di JavaScript
un formato di testo completamente indipendente dalla
piattaforma
Usa delle convenzioni familiari per i programmatori C/C++/JS
Queste propriet rendono JSON perfetto per lo scambio di dati
3. JSON
JSON si basa su due strutture:
Una collezione di coppie chiave valore (tipicamente Objects)
Una lista ordinata di valori (tipicamente Arrays)
La sintassi 竪 talmente semplice che qualunque linguaggio lo
gestisce facilmente
4. Objects
Un oggetto 竪 una lista non ordinata di coppie chiave/valore
Un oggetto inizia con { e termina con }
Ogni nome 竪 seguito da due punti :
Le coppie sono separate da una virgola ,
Ad esempio {nome:valore, nome2: valore2}
5. Arrays
Un Array, invece, 竪 una lista di valori ordinati
Un array inizia con una parentesi quadra [
Un array finisce con una parentesi quadra ]
Ogni valore 竪 separato da una virgola
Es. [valore, valore1, valore2, ....]
6. Values
Un valore pu嘆 essere un oggetto di diversi tipi
Pu嘆 avere valori annidati
String
Number
Object (anche null)
{true, false}
7. Strings
Le strings possono essere di vario genere
Sono sempre racchiuse da apici
Possono essere usati i soliti escaped characters
Ad esempio n, t, f, , /
Oppure caratteri unicode in esadecimale con u007E (~)
8. Numbers
Anche i numeri hanno una rappresentazione standard
Possono essere negativi con un - davanti
Contengono . per i decimali
Infine possono avere la notazione scientifica {e,E}賊
Esempi 1.2E23, 13.2e-12
9. JSON per Objective-C
JSON 竪 veramente platform-independent
Esistono librerie per QUALUNQUE linguaggio
parte dellRFC 4627
come XML ma senza la parte grassa
Noi vedremo la sua implementazione in Objective-C
Chiamata JSON-Framework
10. JSON Framework
JSON parser e generator
Aggiunge nuove categorie agli oggetti Objective-C
Fornisce API per il controllo degli oggetti
Fornisce uno stack di errori per capire in caso di codice non
valido
Ricorsione configurabile per maggiore sicurezza
Louput pu嘆 essere direttamente incluso in dizionari
11. Come installarlo
JSON Framework 竪 un progetto Open Source di Stig Brautaset
possibile scaricare il codice da GitHub
Per scaricare lultima versione 竪 necessario usare il tool git
Su Mac il tool 竪 semplice da scaricare da qui
Chi vuole si pu嘆 installare anche il tool GitX che fornisce una
pratica GUI per analizzare i progetti GIT
12. Clonare il repo
Per scaricare da Git un progetto 竪 necessario il tool git
Aprire un terminale e digitare:
cd ~/cartellaMioProgetto/
git clone git://github.com/stig/json-framework
necessario copiare i files nel progetto
Come al solito Add->Existing File.. e selezionare Classes
13. Predisporre lambiente
Inseriti i files della libreria nel nostro progetto,
Creiamo una classe Obj-C con Add->New File..
Ereditiamo da NSObject
Chiamiamo la classe JSONSupport
E definiamo i vari metodi di accesso alla classe
14. Oppure
Possiamo direttamente richiamare la libreria dal progetto
Nel nostro RootViewController importiamo JSON.h
#import <JSON/JSON.h>
Dichiariamo una variabile dappoggio jsonArray nel file .h
@interface RootViewController : UITableViewController {
! NSMutableArray *jsonArray; }
@property (nonatomic, retain) NSMutableArray *jsonArray;
15. Altre aggiunte
Ora sintetizziamo la variabile che ci serve
@synthesize jsonArray;
Ora non ci resta che includere il codice in viewDidLoad:
- (void)viewDidLoad {
! NSURL *jsonURL = [NSURL URLWithString:@"http://tsc.prossimaisola.com/mobile/it/contenuto/all/1,4/json"];
! NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL];
! NSLog(jsonData);
! // Converte il dato json in unarray
! self.jsonArray = [jsonData JSONValue];
! //NSLog(@"count is: %i", [self.jsonArray count]);
!
}
Possiamo decidere la stringa in maniera totalmente arbitraria
16. Altre piccole modifiche
Adesso 竪 necessario istruire il nostro RVC riguardo larray
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
! return [jsonArray count];
}
Infine nella funzione cellForRowAtIndexPath: configurare la
cella che ci servir
cell.text = (NSString *)[self.jsonArray objectAtIndex:indexPath.row];
17. Liberiamo le variabili
ora giunto il momento di liberare la memoria dal nostro codice
- (void)dealloc {
! [jsonArray dealloc];
! [super dealloc];
}
Una volta che abbiamo loggetto jsonArray saremo in grado di
parsare il codice
In pratica abbiamo fatto qualche precisazione nel codice del
progetto
Pi湛 avanti vediamo come abbiamo fatto
18. Leggere e scrivere su/da files
iOS permette di creare files e di scriverne il contenuto
Teoricamente alcuni tipi di oggetto supportano writeToFile:
necessario specificare semplicemente un fileName
Per fare questo basta una variabile di tipo NSString
Bisogna per嘆 specificare anche la directory in cui scrivere
Andiamo quindi a vedere tutto il metodo
19. Scrivere
Scrivere su file 竪 molto semplice:
//Il metodo scrive il contenuto duna stringa su un file
-(void) writeToTextFile: (NSString*) content{
! //Cerca la cartella con i documenti
! NSArray *paths = NSSearchPathForDirectoriesInDomains
! (NSDocumentDirectory, NSUserDomainMask, YES);
! NSString *documentsDirectory = [paths objectAtIndex:0];
!
! //Crea un file da scrivere nella suddetta cartella:
! NSString *fileName = [NSString stringWithFormat:@"%@/info.plist",
! ! ! ! ! ! documentsDirectory];
!
! //salva il contenuto nella directory Documenti
! [content writeToFile:fileName
! ! ! atomically:NO
! ! ! ! encoding:NSStringEncodingConversionAllowLossy
! ! ! ! error:nil];
!
}
Il codice inizialmente va alla ricerca della directory predefinita
dei documenti col metodo
NSSearchPathForDirectoriesInDomains:
20. Ancora sulla scrittura
Dopodich辿 indirizza il primo valore dellarray che trova
Quella 竪 loccorrenza della cartella definita per i documenti
Quando utilizziamo il Simulatore iPhone:
Accediamo comunque alle risorse dellapplicazione
Queste sono in /Users/<Nome>/Application Support/iPhone
Simulator/<UUID dellApp>/Documents/
Utilizzare questa risorsa 竪 fondamentale per il debug dellApp
21. Ancora sui Plist
Un file Plist contiene una chiave principale (nodes) di tipo
Array
Questo array contiene diversi valori che sono dei Dizionari
(node nel nostro caso)
Allinterno del Dizionario 竪 presente una stringa col valore
tutto editabile con il Property List Editor di default in MacOSX
Per aprire un Plist cliccare col tasto destro e scegliere PLE.app
22. Lettura
Anche la lettura da un file 竪 una cosa relativamente semplice
//Questo metodo legge il contenuto del file e lo mette
// in una stringa
-(NSString *) displayContent{
! //get the documents directory:
! NSArray *paths = NSSearchPathForDirectoriesInDomains
! (NSDocumentDirectory, NSUserDomainMask, YES);
! NSString *documentsDirectory = [paths objectAtIndex:0];
! NSString *fileName = [NSString stringWithFormat:@"%@/info.plist",
! ! ! ! ! ! documentsDirectory];
! //Commentiamo questa riga perch辿 ci serve solo a scopo didattico
//NSString *content = [[NSString alloc] initWithContentsOfFile:fileName
! ! ! ! ! ! ! ! ! ! ! ! ! //usedEncoding:nil
! ! ! ! ! ! ! ! ! ! ! ! ! //! error:nil];
!
! return fileName;
}
In questo caso la funzione restituisce il nome del file
Eventualmente anche una stringa col contenuto del file
23. Due parole anche qui
In realt quello che si fa 竪 recuperare il nome del file
Questo perch辿 pi湛 avanti nel codice riempiremo un Dictionary
Il bello 竪 che potremo iterare allinterno di valori di questo
Potremo anche specificare con pi湛 libert i valori che ci servono
La struttura del file che salviamo 竪 di tipo XML
Eventualmente pu嘆 essere elaborata da una UIWebView
24. Una precisazione
In questo esempio abbiamo salvato dei files plist
Sono files di properties
Pi湛 semplici da maneggiare
Sono files XML ma molto semplici
Possono essere raccolti in NSDictionary
Possono essere inclusi alloccorrenza in NSBundles
25. Recuperare dei valori consoni
Ora che abbiamo creato le due routines di lettura/scrittura
Possiamo includere una nella vista principale allapertura
Laltra nella vista in cui le informazioni devono essere viste
Nella vista info si pu嘆 poi specificare che si vuole accedere al file
Nel caso in cui non sia presente la rete si prende il valore del file
26. Recuperare i valori
Ambedue le routine, quella in PortVC e InfoVC, hanno il
metodo viewDidLoad: modificato
Nel PortViewController il codice sar quello di connessione
La variabile di connessione 竪 conveniente non metterla statica
Basta anche uno switch/case per cambiare la tipologia di Stringa
Poi la connessione pu嘆 essere racchiusa in un metodo
In questo caso 竪 utile sviluppare un modello come visto prima
27. A che punto siamo?
Abbiamo quasi finito, ci basta solo riordinare le cose
In PortViewController modifichiamo viewDidLoad:
- (void)viewDidLoad {
! [super viewDidLoad];
! NSURL *jsonURL = [NSURL URLWithString:@"http://tsc.prossimaisola.com/mobile/it/contenuto/all/1,4/json"];
! //self.jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL];
! NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL];
! NSArray *jsonArray = [jsonData JSONValue];
! [self writeToTextFile:jsonArray];
! NSLog(@"Data: %@",jsonArray);
}
Per semplicit ho messo lindirizzo statico
A voi il compito di codificare tutti i vari casi :D
28. InfoViewController
Invece in InfoViewController.m recuperiamo i dati e stampiamo
- (void)viewDidLoad {
[super viewDidLoad];
! !
! NSString *contentOfFile = [NSString new];
! contentOfFile = [self displayContent];
! NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:contentOfFile];
! for (id key in plistDict) {
NSArray *array = [plistDict objectForKey:key];
! ! NSLog(@"key: %@, value: %@", key , [array objectAtIndex:0]);
! ! NSLog(@"key: %@, value: %@", key , [array objectAtIndex:1]);
! }
! [plistDict release];
}
Qui ci vuole qualche precisazione
Iteriamo sulla chiave e visualizziamo i valori
29. Ancora su chiave/valore
Per prendere il determinato valore alla chiave title
Possiamo ulteriormente iterare sul Dizionario
E col metodo valueForKey:@title possiamo ottenere quel
che ci serve
Una volta ottenuta lArray di stringhe 竪 sufficiente passarla al
metodo cellForRowAtIndexPath:
Fatto questo si visualizza correttamente il valore
30. Infine
Ricordiamoci anche di modificare il metodo
numbersOfRowAtIndexPath:
Di passare [nomedellArray count]; per indicare le righe
Un suggerimento:
Utilizzo di NSEnumerator
Essenzialmente quelli che si usano nel mondo dei DB
31. Riepilogo
Abbiamo creato due funzioni una per scrivere una per leggere
Le informazioni che cinteressano sono in viewDidLoad:
In un caso nella view che si apre allinizio del ciclo di vita dellapp
Nellaltro nella view che ci serve per visualizzare i messaggi
Si pu嘆 implementare un meccanismo di lettura se manca la rete
In caso contrario si fa una nuova richiesta
33. Cos竪 Layar
un tool per la realt aumentata per iPhone e Android
Lazienda fornisce lapplicazione in maniera totalmente free
Funziona con dei livelli che possono essere caricati nel
programma
C竪 una sorta di Store che consente di scaricare nuovi livelli
Basta scegliere i livelli che cinteressano e caricarli
34. Perch辿 竪 fico?
Molte aziende lo usano con successo per promuovere i propri
prodotti
Ci sono diversi tipi di modi per lavorare con Layar
Prima cosa 竪 necessario che gli sviluppatori creino un layer
Questo layer pu嘆 essere 2D o 3D
In esso si possono indicare dei POI (Points of Interests) su una
mappa
35. Altre caratteristiche
A differenza di tool come ReactiVision o simili
Layar ha sempre un riferimento geolocalizzato delle
informazioni
comunque sempre necessario che il programma (Player)
sinterfacci con la rete ed il segnale GPS
Non supporta nativamente il riconoscimento di tags
Pu嘆 essere integrato allinterno di unapplicazione esistente
36. Come funziona con iPhone
Fortunatamente per iPhone Layar fornisce un SDK
LSDK va scaricato dal sito Web degli sviluppatori
Consiste in una serie di classi molto semplici
Tipicamente si richiama una view di Layer con modalView
Poi qualcuno sincaricher di rilasciare modalViewController
quando questa non serve pi湛
37. Configurare laccount dev
Entriamo in http://www.layar.com/publishing/signup/
acceptterms/developer/?next=/publishing/
Ci registriamo come Developers
Dopodich辿 definiamo un nuovo Layer Dummy
Io ho inserito dei finti URL e un nome indicativo
Attivare lautenticazione OAuth
Inserire password e nome utente scelto ad hoc
38. Prima di testare il layer
Prima di testare il nostro layer nel Layer Player
Verificare i seguenti parametri di connessione
Nome Layer
OAuth Consumer Key
OAuth Consumer Secret
Ora possiamo scaricare lSDK
39. Next Step
necessario ora scaricare lSDK dal sito di Layar
Per importarlo nel progetto il solito Add->Existing Files...
Ora come abbiamo visto nel caso di JSON basta aggiungere il
player al progetto
ora possibile interagire con le classi per aprire un controller
Vediamo il codice che serve per aprire una view modale
41. Due commenti
La classe principale 竪 LPAugmentedRealityViewController
Questa classe non 竪 altro che un view controller
Come NIB sostanzialmente passiamo un layer
E i parametri di autenticazione tramite OAuth
Gli altri sono parametri abbastanza comprensibili
Possiamo personalizzare il layer tramite il sito di Layar
42. Precisazioni
Per semplicit il codice 竪 condensato
Come al solito si pu嘆 definire un modello e chiamare queste
funzioni allinterno di un modello
In questo caso non 竪 necessario definire una view
La view 竪 gi configurata in maniera programmatica dalla libreria
Sar semplicemente necessario istanziare la classe
45. Cos竪 Three20
Three20 竪 una libreria per iOS
Parte dallo sviluppo della prima applicazione di FaceBook
Contiene una marea di classi gi pronte
In pi湛 contiene anche una marea di esempi
Per ogni esempio viene svelata una funzionalit specifica
Il progetto 竪 molto vasto ed in una fase decisamente matura
46. Chi la usa?
Come al solito il tasso di popolarit 竪 direttamente proporzionale
alla maturit
Gran parte delle parte delle applicazioni che si basano su AppKit
Contiene veramente centinaia di controlli alcuni anche nuovi
Sono molto semplici da manipolare e facilitano la scrittura
dellapp
Per citarne uno il famoso Release to update
47. Features
Essendo Open Source abbiamo anche la possibilit di estenderlo
Nel sito Three20.info ci sono anche altre estensioni
Basta comuque prendere spunto dagli esempi per diventare
subito operativi
Vediamo un po come configurare il tutto
Partiamo dallimportazione nel progetto della libreria
48. Aggiungere Three20
possibile includere Three20 tramite un semplice script python
python three20/src/scripts/ttmodule.py -p path/to/
myProject.xcodeproj Three20
Automaticamente tutti i moduli vengono importati
Si pu嘆 anche utilizzare il vecchio metodo
Ci sono dei problemi con le librerie condivise
Conviene usare i flag -all_load e -ObjC
49. Launcher
Launcher 竪 forse il controllo pi湛 bello messo a disposizone
compatibile con iPhone e iPad
utilizzato gi da uninfinit di App (iSpazio.net ad esempio)
Il modo pi湛 semplice per utilizzarlo 竪 fare riferimento all relativo
oggetto chiamato TTLauncherViewController
Possiamo definire una classe che erediti da questo
50. BasicLauncherViewController
Ecco come dovr apparire il file header di classe:
#import <Three20Launcher/Three20Launcher.h>
@interface BasicLauncherViewController : TTLauncherViewController {
}
@end
Mi sembra che non sia necessario a questo punto nessun
chiarimento...
52. TTRELEASE_
La nostra bellissima libreria sincarica anche di rilasciare gli
oggetti ormai non pi湛 utilizzati
Tramite delle Macro, il rilascio avviene in maniera sicura
Quante volte 竪 capitato di vedere crashare un programma per
questo motivo
Nella documentazione 竪 definita anche questa funzionalit
53. Chicca finale
Three20 include anche un parser JSON molto performante
Si chiama YAJL ed 竪 scritto in C
Qui 竪 stato scritto un wrapper completamente in Objective-C
anche presente il nostro SBJSONParser
Inoltre ci sono una serie infinita di aggiunte alle classi standard
Bisogner chiamare le nuove classi col prefisso TT*
54. The end
Anche per oggi abbiamo finito
Queste slide saranno disponibili sul sito entro oggi
http://sites.google.com/a/prossimaisola.com/ios/
Per qualsiasi bug fare una richiesta per il sito
Mettiamo il bug a disposizione di tutti e vediamo chi lo risolve
prima