• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Programming iOS lezione 3
 

Programming iOS lezione 3

on

  • 1,332 views

 

Statistics

Views

Total Views
1,332
Views on SlideShare
1,312
Embed Views
20

Actions

Likes
0
Downloads
31
Comments
0

4 Embeds 20

http://www.jugsardegna.org 16
http://jugsardegna.org 2
http://www.jugsardegna.org:8080 1
http://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

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

    Programming iOS lezione 3 Programming iOS lezione 3 Presentation Transcript

    • TERZA LEZIONE
    • JSONJSON (JavaScript Object Notation) è un protocollo moltoleggero per scambio d’informazioniÈ basato su un sottoinsieme di JavaScriptÈ un formato di testo completamente indipendente dallapiattaformaUsa delle convenzioni familiari per i programmatori C/C++/JSQueste proprietà rendono JSON perfetto per lo scambio di dati
    • JSONJSON 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 logestisce facilmente
    • ObjectsUn 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}
    • ArraysUn 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, ....]
    • ValuesUn valore può essere un oggetto di diversi tipiPuò avere valori annidati String Number Object (anche null) {true, false}
    • StringsLe strings possono essere di vario genereSono sempre racchiuse da apici “”Possono essere usati i soliti escaped characters Ad esempio n, t, f, , / Oppure caratteri unicode in esadecimale con u007E (~)
    • NumbersAnche i numeri hanno una rappresentazione standardPossono essere negativi con un - davantiContengono . per i decimaliInfine possono avere la notazione scientifica {e,E}±Esempi 1.2E23, 13.2e-12
    • JSON per Objective-CJSON è veramente platform-independentEsistono librerie per QUALUNQUE linguaggioÈ parte dell’RFC 4627È come XML ma senza la parte “grassa”Noi vedremo la sua implementazione in Objective-CChiamata JSON-Framework
    • JSON FrameworkJSON parser e generatorAggiunge nuove categorie agli oggetti Objective-CFornisce API per il controllo degli oggettiFornisce uno stack di errori per capire in caso di codice nonvalidoRicorsione configurabile per maggiore sicurezzaL’ouput può essere direttamente incluso in dizionari
    • Come installarloJSON Framework è un progetto Open Source di Stig BrautasetÈ possibile scaricare il codice da GitHubPer scaricare l’ultima versione è necessario usare il tool gitSu Mac il tool è semplice da scaricare da quiChi vuole si può installare anche il tool GitX che fornisce unapratica GUI per analizzare i progetti GIT
    • Clonare il repoPer scaricare da Git un progetto è necessario il tool gitAprire 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 l’ambienteInseriti i files della libreria nel nostro progetto,Creiamo una classe Obj-C con Add->New File..Ereditiamo da NSObjectChiamiamo la classe JSONSupportE definiamo i vari metodi di accesso alla classe
    • OppurePossiamo direttamente richiamare la libreria dal progettoNel nostro RootViewController importiamo JSON.h#import <JSON/JSON.h>Dichiariamo una variabile d’appoggio 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 un’array! 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 l’array - (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 l’oggetto 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 filesiOS permette di creare files e di scriverne il contenutoTeoricamente alcuni tipi di oggetto supportano writeToFile:È necessario specificare semplicemente un fileNamePer fare questo basta una variabile di tipo NSStringBisogna però specificare anche la directory in cui scrivereAndiamo quindi a vedere tutto il metodo
    • Scrivere Scrivere su file è molto semplice://Il metodo scrive il contenuto d’una 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 scritturaDopodiché indirizza il primo valore dell’array che trovaQuella è l’occorrenza della cartella definita per i documentiQuando utilizziamo il Simulatore iPhone: Accediamo comunque alle risorse dell’applicazione Queste sono in /Users/<Nome>/Application Support/iPhone Simulator/<UUID dell’App>/Documents/ Utilizzare questa risorsa è fondamentale per il debug dell’App
    • Ancora sui PlistUn file Plist contiene una chiave principale (“nodes”) di tipoArrayQuesto array contiene diversi valori che sono dei Dizionari(“node” nel nostro caso)All’interno del Dizionario è presente una stringa col valoreÈ tutto editabile con il Property List Editor di default in MacOSXPer 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 quiIn realtà quello che si fa è recuperare il nome del fileQuesto perché più avanti nel codice riempiremo un DictionaryIl bello è che potremo iterare all’interno di valori di questoPotremo anche specificare con più libertà i valori che ci servonoLa struttura del file che salviamo è di tipo XMLEventualmente può essere elaborata da una UIWebView
    • Una precisazioneIn questo esempio abbiamo salvato dei files plistSono files di propertiesPiù semplici da maneggiareSono files XML ma molto sempliciPossono essere raccolti in NSDictionaryPossono essere inclusi all’occorrenza in NSBundles
    • Recuperare dei valori consoniOra che abbiamo creato le due routines di lettura/scritturaPossiamo includere una nella vista principale all’aperturaL’altra nella vista in cui le informazioni devono essere visteNella vista info si può poi specificare che si vuole accedere al fileNel caso in cui non sia presente la rete si prende il valore del file
    • Recuperare i valoriAmbedue le routine, quella in PortVC e InfoVC, hanno ilmetodo viewDidLoad: modificatoNel PortViewController il codice sarà quello di connessioneLa variabile di connessione è conveniente non metterla staticaBasta anche uno switch/case per cambiare la tipologia di StringaPoi la connessione può essere racchiusa in un metodoIn 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 l’indirizzo 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/valorePer 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 l’Array di stringhe è sufficiente passarla al metodo cellForRowAtIndexPath: Fatto questo si visualizza correttamente il valore
    • InfineRicordiamoci anche di modificare il metodonumbersOfRowAtIndexPath:Di passare [nomedellArray count]; per indicare le righeUn suggerimento: Utilizzo di NSEnumerator Essenzialmente quelli che si usano nel mondo dei DB
    • RiepilogoAbbiamo creato due funzioni una per scrivere una per leggereLe informazioni che c’interessano sono in viewDidLoad:In un caso nella view che si apre all’inizio del ciclo di vita dell’appNell’altro nella view che ci serve per visualizzare i messaggiSi può implementare un meccanismo di lettura se manca la reteIn caso contrario si fa una nuova richiesta
    • LAYAR SDK
    • Cos’è LayarÈ un tool per la realtà aumentata per iPhone e AndroidL’azienda fornisce l’applicazione in maniera totalmente freeFunziona con dei livelli che possono essere caricati nelprogrammaC’è una sorta di Store che consente di scaricare nuovi livelliBasta scegliere i livelli che c’interessano e caricarli
    • Perché è fico?Molte aziende lo usano con successo per promuovere i propriprodottiCi sono diversi tipi di modi per lavorare con LayarPrima cosa è necessario che gli sviluppatori creino un layerQuesto layer può essere 2D o 3DIn esso si possono indicare dei POI (Points of Interests) su unamappa
    • Altre caratteristicheA differenza di tool come ReactiVision o simili Layar ha sempre un riferimento geolocalizzato delle informazioni È comunque sempre necessario che il programma (Player) s’interfacci con la rete ed il segnale GPS Non supporta nativamente il riconoscimento di tags Può essere integrato all’interno di un’applicazione esistente
    • Come funziona con iPhoneFortunatamente per iPhone Layar fornisce un SDKL’SDK va scaricato dal sito Web degli sviluppatoriConsiste in una serie di classi molto sempliciTipicamente si richiama una view di Layer con modalViewPoi qualcuno s’incaricherà di rilasciare modalViewControllerquando questa non serve più
    • Configurare l’account devEntriamo in http://www.layar.com/publishing/signup/acceptterms/developer/?next=/publishing/Ci registriamo come DevelopersDopodiché definiamo un nuovo Layer DummyIo ho inserito dei finti URL e un nome indicativoAttivare l’autenticazione OAuthInserire password e nome utente scelto ad hoc
    • Prima di testare il layerPrima di testare il nostro layer nel Layer PlayerVerificare i seguenti parametri di connessione Nome Layer OAuth Consumer Key OAuth Consumer Secret Ora possiamo scaricare l’SDK
    • Next StepÈ necessario ora scaricare l’SDK dal sito di LayarPer importarlo nel progetto il solito Add->Existing Files...Ora come abbiamo visto nel caso di JSON basta aggiungere ilplayer al progettoÈ ora possibile interagire con le classi per aprire un controllerVediamo il codice che serve per aprire una view modale
    • Codice d’esempio #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 commentiLa classe principale è LPAugmentedRealityViewControllerQuesta classe non è altro che un view controllerCome “NIB” sostanzialmente passiamo un layerE i parametri di autenticazione tramite OAuthGli altri sono parametri abbastanza comprensibiliPossiamo personalizzare il layer tramite il sito di Layar
    • PrecisazioniPer semplicità il codice è condensatoCome al solito si può definire un modello e chiamare questefunzioni all’interno di un modelloIn questo caso non è necessario definire una viewLa view è già configurata in maniera programmatica dalla libreriaSarà semplicemente necessario istanziare la classe
    • Commentihttp://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’è Three20Three20 è una libreria per iOSParte dallo sviluppo della prima applicazione di FaceBookContiene una marea di classi già pronteIn più contiene anche una marea di esempiPer ogni esempio viene svelata una funzionalità specificaIl progetto è molto vasto ed in una fase decisamente matura
    • Chi la usa?Come al solito il tasso di popolarità è direttamente proporzionalealla maturitàGran parte delle parte delle applicazioni che si basano su AppKitContiene veramente centinaia di controlli alcuni anche nuoviSono molto semplici da manipolare e facilitano la scritturadell’appPer citarne uno il famoso Release to update
    • FeaturesEssendo Open Source abbiamo anche la possibilità di estenderloNel sito Three20.info ci sono anche altre estensioniBasta comuque prendere spunto dagli esempi per diventaresubito operativiVediamo un po’ come configurare il tuttoPartiamo dall’importazione nel progetto della libreria
    • Aggiungere Three20È possibile includere Three20 tramite un semplice script pythonpython three20/src/scripts/ttmodule.py -p path/to/myProject.xcodeproj Three20Automaticamente tutti i moduli vengono importatiSi può anche utilizzare il vecchio metodoCi sono dei problemi con le librerie condivise Conviene usare i flag -all_load e -ObjC
    • LauncherLauncher è forse il controllo più bello messo a disposizoneÈ compatibile con iPhone e iPadÈ utilizzato già da un’infinità di App (iSpazio.net ad esempio)Il modo più semplice per utilizzarlo è fare riferimento all relativooggetto chiamato TTLauncherViewControllerPossiamo 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 d’implementazione è 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 definire il launcher ed inizializzarlo
    • TTRELEASE_La nostra bellissima libreria s’incarica anche di rilasciare glioggetti ormai non più utilizzatiTramite delle Macro, il rilascio avviene in maniera sicuraQuante volte è capitato di vedere crashare un programma perquesto motivoNella documentazione è definita anche questa funzionalità
    • Chicca finaleThree20 include anche un parser JSON molto performanteSi chiama YAJL ed è scritto in CQui è stato scritto un wrapper completamente in Objective-CÈ anche presente il nostro SBJSONParserInoltre ci sono una serie infinita di aggiunte alle classi standardBisognerà chiamare le nuove classi col prefisso TT*
    • The endAnche per oggi abbiamo finitoQueste slide saranno disponibili sul sito entro oggihttp://sites.google.com/a/prossimaisola.com/ios/Per qualsiasi bug fare una richiesta per il sitoMettiamo il bug a disposizione di tutti e vediamo chi lo risolveprima
    • ALLA PROSSIMA LEZIONE!