際際滷

際際滷Share a Scribd company logo
TERZA LEZIONE
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
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
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}
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, ....]
Values
Un valore pu嘆 essere un oggetto di diversi tipi

Pu嘆 avere valori annidati

  String

  Number

  Object (anche null)

  {true, false}
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 (~)
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
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
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
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
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
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
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;
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
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];
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
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
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:
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
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
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
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
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
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
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
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
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
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
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
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
LAYAR SDK
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
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
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
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湛
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
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
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
Codice desempio

      #import <LayarPlayer.h>
!   NSString *layerName =@"pippo";
!   NSString *consumerKey =@"user";
!   NSString *consumerSecret =@"password";
!   NSArray *oauthKeys = [NSArray arrayWithObjects:LPConsumerKeyParameterKey, LPConsumerSecretParameterKey, nil];
!   NSArray *oauthValues = [NSArray arrayWithObjects:consumerKey, consumerSecret, nil];
!   NSDictionary *oauthParameters = [NSDictionary dictionaryWithObjects:oauthValues forKeys:oauthKeys];
!   NSArray *layerKeys = [NSArray arrayWithObject:@"radius"];
!   NSArray *layerValues = [NSArray arrayWithObject:@"1000"];
!   NSDictionary *layerFilters = [NSDictionary dictionaryWithObjects:[layerValues forKeys:layerKeys];
!   LPAugmentedRealityViewController *augmentedRealityViewController = [[[ LPAugmentedRealityViewController alloc] init]
autorelease];
!   augmentedRealityViewController.delegate = self;
!   [self presentModalViewController:augmentedRealityViewController animated:YES];
!   [augmentedRealityViewController loadLayerWithName:layerName
!   !      !     !    !     !   !     !    !       oauthParameters:oauthParameters
!   !      !     !    !     !   !     !    !       layerFilters:layerFilters options:LPMapViewDisabled | LPListViewDisabled];
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
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
Commenti

http://www.layar.com/publishing/testpage/page/pippo/

Serve questa pagina per inserire POI (Point of Interests)

Una volta pronto il layer si pu嘆 inviare al revisore per la convalida

  Request for Approval 竪 il bottone da cliccare

  I layar si possono fare free oppure a pagamento
THREE20
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
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
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
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
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
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...
BasicLauncherViewController
    Invece il file dimplementazione 竪 leggermente pi湛 complesso:
    #import "BasicLauncherViewController.h"



@implementation BasicLauncherViewController

- (void)viewDidLoad {
[super viewDidLoad];

TTLauncherItem* item =
[[TTLauncherItem alloc] initWithTitle: @"Item title"
image: @"bundle://Icon.png"
URL: nil];
[self.launcherView addItem:item animated:NO];
TT_RELEASE_SAFELY(item);
}

@end




    Scherzavo! Basta de鍖nire il launcher ed inizializzarlo
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
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*
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
ALLA PROSSIMA LEZIONE!

More Related Content

Programming iOS lezione 3

  • 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
  • 40. Codice desempio #import <LayarPlayer.h> ! NSString *layerName =@"pippo"; ! NSString *consumerKey =@"user"; ! NSString *consumerSecret =@"password"; ! NSArray *oauthKeys = [NSArray arrayWithObjects:LPConsumerKeyParameterKey, LPConsumerSecretParameterKey, nil]; ! NSArray *oauthValues = [NSArray arrayWithObjects:consumerKey, consumerSecret, nil]; ! NSDictionary *oauthParameters = [NSDictionary dictionaryWithObjects:oauthValues forKeys:oauthKeys]; ! NSArray *layerKeys = [NSArray arrayWithObject:@"radius"]; ! NSArray *layerValues = [NSArray arrayWithObject:@"1000"]; ! NSDictionary *layerFilters = [NSDictionary dictionaryWithObjects:[layerValues forKeys:layerKeys]; ! LPAugmentedRealityViewController *augmentedRealityViewController = [[[ LPAugmentedRealityViewController alloc] init] autorelease]; ! augmentedRealityViewController.delegate = self; ! [self presentModalViewController:augmentedRealityViewController animated:YES]; ! [augmentedRealityViewController loadLayerWithName:layerName ! ! ! ! ! ! ! ! ! oauthParameters:oauthParameters ! ! ! ! ! ! ! ! ! layerFilters:layerFilters options:LPMapViewDisabled | LPListViewDisabled];
  • 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
  • 43. Commenti http://www.layar.com/publishing/testpage/page/pippo/ Serve questa pagina per inserire POI (Point of Interests) Una volta pronto il layer si pu嘆 inviare al revisore per la convalida Request for Approval 竪 il bottone da cliccare I layar si possono fare free oppure a pagamento
  • 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...
  • 51. BasicLauncherViewController Invece il file dimplementazione 竪 leggermente pi湛 complesso: #import "BasicLauncherViewController.h" @implementation BasicLauncherViewController - (void)viewDidLoad { [super viewDidLoad]; TTLauncherItem* item = [[TTLauncherItem alloc] initWithTitle: @"Item title" image: @"bundle://Icon.png" URL: nil]; [self.launcherView addItem:item animated:NO]; TT_RELEASE_SAFELY(item); } @end Scherzavo! Basta de鍖nire il launcher ed inizializzarlo
  • 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