Festival di Venezia 2008 con un feed RSS per iPhone : Guida Pratica [n.2]

Pratica

Pratica

Immagino che già vi starete chiedendo cosa c’entra la 65a Mostra Internazionale d’arte Cinematografica di Venezia 2008 con l’ Iphone e una guida pratica come questa ?. Semplice : imparare a sviluppare software per Iphone vuol dire soprattutto dargli vita, renderlo utile, speciale per le nostre esigenze e quelle di miglioni di possessori.

Andremo a sviluppare un programma di feed RSS per Iphone, abbastanza semplice nel suo genere ma allo stesso tempo complesso per essere solo alla seconda guida pratica (anche per me). Ho fatto questa scelta perchè volevo unire l’utile al dilettevole. Dobbiamo imparare ma allora perchè non farlo anche divertendoci…

Cosi vivendo per dieci giorni nella capitale mondiale del Cinema (Lido di Venezia) ho pensato quanto interessante sarebbe per i possessori di un Iphone ricevere in tempo reale delle news su attori, gossip, foto, e il programma giornaliero dei film che verranno proiettati nelle diverse sale ?.

Cominciamo subito quindi la parte di sviluppo. Il software che verrà generato non farà altro che una chiamata ad un servizio RSS (in questo caso al mio sito iphoneandgo.wordpress.com) che popolerà una lista con i titoli degli articoli pubblicati e permetterà all’utente di sceglierli facendo partire il navigatori Safari che caricherà la pagina corrispondente all’articolo.

Carichiamo il nostro Xcode e dal manu File scegliamo -> new project.

Clicchiamo su Application sotto Iphone Os e scegliamo l’icona -> “Navigation-Based application”

Scegliamo la directory o creiamone una dove posizionare il nostro progetto e diamogli il nome “RSSIphoneAndGo”.

Xcode Rss

Xcode Rss

Xcode ha inserito già in alcuni file delle istruzioni diverse da una applicazione “view based application”. Se proviamo a compilarlo con “build and Go” apparirà il simulatore con il nostro Iphone con finestra vuota.

Come prima cosa allora adesso andremo ad inserire il Titolo della nostra applicazione, quello insomma che apparirà nella Top view non appena lanceremo il programma. Portiamoci sopra il file “MainWindow.xib” e apriamolo cliccandoci 2 volte sopra velocemente.

Si aprirà in nostro Interface Builder, posizioniamoci sopra la Top View azzurra e clicchiamoci sopra due volte ed inseriamo il Titolo : “Iphone And Go RSS”.

Interface Builder RSS

Interface Builder RSS

Andiamo su File e premiamo Save dopodichè usciamo da Interface Builder.

Ritorniamo ora nel nostro Xcode e clicchiamo due volte sul file “RootViewControoler.h” e aggiungiamo il codice che segue:

@interface RootViewController : UITableViewController {IBOutlet UITableView * newsTable;UIActivityIndicatorView * activityIndicator;

CGSize cellSize;

NSXMLParser * rssParser;

NSMutableArray * stories;

// a temporary item; added to the “stories” array one at a time, and cleared for the next one
NSMutableDictionary * item;

// it parses through the document, from top to bottom…
// we collect and cache each sub-element value, and then save each item to our array.
// we use these to track each current item, until it’s ready to be added to the “stories” array
NSString * currentElement;
NSMutableString * currentTitle, * currentDate, * currentSummary, * currentLink;

}

Apro una parentesi: per il codice che andremo a scrivere non sono riuscito a fare le traduzioni delle didascalie lasciandole in inglese e nemmeno a spiegare ogni singola linea che andremo ad inserire (cosa che faremo più avanti).

Salviamo il file modificato e da Xcode ora apriamo il file “RootViewControler.m”. Questo file come vedete e vedrete e’ il cuore del nostro programma. dove verranno passate le informazioni da mostrare nella finestra, e cosa fare in varie situazioni come cliccare un articolo o chiudere il programma.

Cambiamo questa riga di codice nel modo seguente :

– (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [stories count];

abbiamo sostituito lo 0 con [stories count]

In questa dichiarazione noi spieghiamo di volere un array NSMuutableArray (che è un collezione di oggetti modificabili) che chiameremo “stories”. In nostro RSS popolerà le righe con gli articoli tanti quanti ne potrà mettendoli nell’array. Questo metodo dirà alla Tabella queste sono le righe che noi abbiamo bisogno. una per ogni articolo nell’array.

Ora modifichiamo il codice come segue :

– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *MyIdentifier = @”MyIdentifier”;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
}

// Set up the cell
int storyIndex = [indexPath indexAtPosition: [indexPath length] -1];
[cell setText:[[stories objectAtIndex: storyIndex] objectForKey: @”title”]];

return cell;
}

Come possiamo vedere usiamo “setText:” metodo per dire alle celle quale sarà il loro contenuto. Ogni riga nella nostra tabella e’ un cella e le sue proprietà sono gestite in questo metodo.

Ora cambiamo il metodo “viewDidAppear:” come segue :

– (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

if ([stories count] == 0) {
NSString * path = @”https://iphoneandgo.wordpress.com/feed”;
[self parseXMLFileAtURL:path];
}
cellSize = CGSizeMake([newsTable bounds].size.width, 60);

}

con questo metodo diciamo al nostro parser quale feed scaricare.

Ora inseriamo questo codice :

– (void)parseXMLFileAtURL:(NSString *)URL {
stories = [[NSMutableArray alloc] init];//you must then convert the path to a proper NSURL or it won’t work
NSURL *xmlURL = [NSURL URLWithString:URL];

// here, for some reason you have to use NSClassFromString when trying to alloc NSXMLParser, otherwise you will get an object not found error
// this may be necessary only for the toolchain
rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];

// Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
[rssParser setDelegate:self];

// Depending on the XML document you’re parsing, you may want to enable these features of NSXMLParser.
[rssParser setShouldProcessNamespaces:NO];
[rssParser setShouldReportNamespacePrefixes:NO];
[rssParser setShouldResolveExternalEntities:NO];

[rssParser parse]

}

Questo è il metodo che aggiungiamo che crea un array vuoto per le stories, crea un parser, e comincia a scaricare le notizie. Mentre il parser fa il suo lavoro, il controller riceverà e gestirà diversi “delegate” metodi con il codice qui riportato da inserire :

– (void)parserDidStartDocument:(NSXMLParser *)parser {
NSLog(@”found file and started parsing”);
}- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString * errorString = [NSString stringWithFormat:@”Unable to download story feed from web site (Error code %i )”, [parseError code]];
NSLog(@”error parsing XML: %@”, errorString);

UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@”Error loading content” message:errorString delegate:self cancelButtonTitle:@”OK” otherButtonTitles:nil];
[errorAlert show];
}

– (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
//NSLog(@”found this element: %@”, elementName);
currentElement = [elementName copy];

if ([elementName isEqualToString:@”item”]) {
// clear out our story item caches…
item = [[NSMutableDictionary alloc] init];
currentTitle = [[NSMutableString alloc] init];
currentDate = [[NSMutableString alloc] init];
currentSummary = [[NSMutableString alloc] init];
currentLink = [[NSMutableString alloc] init];
}
}

– (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

//NSLog(@”ended element: %@”, elementName);
if ([elementName isEqualToString:@”item”]) {
// save values to an item, then store that item into the array…
[item setObject:currentTitle forKey:@”title”];
[item setObject:currentLink forKey:@”link”];
[item setObject:currentSummary forKey:@”summary”];
[item setObject:currentDate forKey:@”date”];

[stories addObject:[item copy]];
NSLog(@”adding story: %@”, currentTitle);
}
}

– (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//NSLog(@”found characters: %@”, string);
// save the characters for the current item…
if ([currentElement isEqualToString:@”title”]) {
[currentTitle appendString:string];
} else if ([currentElement isEqualToString:@”link”]) {
[currentLink appendString:string];
} else if ([currentElement isEqualToString:@”description”]) {
[currentSummary appendString:string];
} else if ([currentElement isEqualToString:@”pubDate”]) {
[currentDate appendString:string];
}
}

– (void)parserDidEndDocument:(NSXMLParser *)parser {

[activityIndicator stopAnimating];
[activityIndicator removeFromSuperview];

NSLog(@”all done!”);
NSLog(@”stories array has %d items”, [stories count]);
[newsTable reloadData];
}

Ora non ci resta che disallocare tutta la memoria utilizzata con il seguente metodo da inserire :

– (void)dealloc {
[currentElement release];
[rssParser release];
[stories release];
[item release];
[currentTitle release];
[currentDate release];
[currentSummary release];
[currentLink release];[super dealloc];
}

Portiamoci ora nel nostro Xcode e clicchiamo due volte nel file : “RootViewController.xib”. Si aprirà cosi il nostro Builder, Posizioniamoci sopra l’icona di “file’s Owner” e tenendo premuto il tasto “control” clicchiamo con il tasto del mouse sinistro e senza rilasciarlo spostiamoci fino a sopra l’icona “Table View”. Rilasciando il pulsante apparirà un menu nero a tendina e tra le tre opzioni scegliere “newsTable”. Salviamo il file e usciamo dal Builder.

Interface Builder Rss

Interface Builder Rss

A questo punto possiamo provare la nostra applicazioni. Premiamo dall’ Xcode “build and go”. Ricordiamo che tale servizio potrebbe caricarsi non molto velocemente soprattutto se si prova direttamente sull’Iphone.

Simulator Rss

Simulator Rss

Manca solo un passaggio ora dire al sistema che una volta cliccato su di una voce dell’articolo, venga caricato Safari che ci porta direttamente alla pagina corrispondente. Aggiungiamo quindi sempre al nostro file “rootViewController.m” il seguente codice :

– (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logicint storyIndex = [indexPath indexAtPosition: [indexPath length] – 1];

NSString * storyLink = [[stories objectAtIndex: storyIndex] objectForKey: @”link”];

// clean up the link – get rid of spaces, returns, and tabs…
storyLink = [storyLink stringByReplacingOccurrencesOfString:@” ” withString:@””];
storyLink = [storyLink stringByReplacingOccurrencesOfString:@”\n” withString:@””];
storyLink = [storyLink stringByReplacingOccurrencesOfString:@” ” withString:@””];

NSLog(@”link: %@”, storyLink);
// open in Safari
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:storyLink]];
}

Simulator Rss

Simulator Rss

Spero che l’articolo sia stato chiaro e abbastanza esaustivo, nei prossimi giorni quindi per tutti gli appassionati non solo dell’Iphone ma anche della mostra del Cinema di Venezia, cercherò di legare queste due realtà postando articoli attinenti e per entrambi d’utilizzo.

Potete scaricare i file sorgenti dell’esempio (source code iphone) al seguente link.

Articolo precedente dell’argomento.

Articolo successivo dell’argomento.

IphoneAndGo - Stefano Lo Duca - loduca_ve@yahoo.it

14 risposte a Festival di Venezia 2008 con un feed RSS per iPhone : Guida Pratica [n.2]

  1. Ugo scrive:

    Bel blog, giá tra i preferiti; ma perché non “iPhone”?😉

  2. Alex scrive:

    Fantastico blog, proprio quello che cercavo per iniziare a sviluppare qualche App x iPhone…
    Grazie!!!

  3. Alberto scrive:

    Grazie, volevo dirtelo dopo aver visto il tuo UTILISSIMO blog!

    Grazie a te inizierò a sviluppare su iPhone🙂

  4. Paolo Mainardi scrive:

    Ottima iniziativa.

    Però, sarebbe bene usare qualche plugin che formatti il codice in maniera leggibile, altrimenti diventa troppo complicato da leggere.

    Tipo questo:
    http://wordpress.org/extend/plugins/wp-syntax/

  5. Gio scrive:

    L’idea è ottima, il risultato un po’ meno.
    Mancano diversi dettagli, mancano spiegazioni approfondite. Diciamo che ci sono ancora grandi margini di miglioramento.

    Grazie cmq

  6. iRob dicotomico scrive:

    Ciao a tutti. Dopo i complimenti per l’idea e la condivisione….una domanda:

    Quando avvio l’icona xcode e apro un nuovo progetto non mi vien fuori l’icona dell’iphone? sapreste dirmi come mai??

  7. Boris scrive:

    risposta banale ma magari: hai installato l’sdk per l’iphone ? perchè oltre a xcoed ti serve anche quello, lo trovi nell'”iphone dev center” in developer.apple.com

  8. Razile scrive:

    Sarebbe carino implementare sull’icona del programma anche il numeretto che indica quanti articoli nuovi sono disponibili e, se proprio si vuole fare ancora di più sarebbe bello anche che quando uno tocca il titolo si venga spostati in una nuova finestra dove si vede anche la description.

  9. lucas914 scrive:

    bravo stefano! continua così….
    per tutti gli Apple User il mio nuovo blog >>> http://theappleuniverse.wordpress.com/

  10. pbjack scrive:

    Ottima guida!! Finalmente!!
    Potresti migliorare, ad esempio, puntualizzando DOVE vanno inseriti le parti di codice.. Spesso dici “inseriamo questo codice”, senza specificare se va inserito dopo la parte appena modificata che, è oltretutto difficile da distinguere da quella da lasciare così come è (potresti ad esempio evidenziarla con un altro colore), o la parte di codice da aggiungere va inserita alla fine del codice già scritto di default dando così meno per scontato cose che magari tanto scontate non sono, anche per chi non parte proprio da zero!!
    Per il resto, complimenti davvero!!! Ci voleva una guida che, con calma, spiegasse passo passo come “costruire” un’applicazione.

  11. Wuillo scrive:

    Ciao
    un grazie anche da parte mia che come neofita ed interessato all’ argomento cerca di muovere i primi passi. Dunque ho provato il tuo esempio, ho fatto il build e nel simulatore funza alla grande. Ho provato quindi a caricare l’ applicazione nel mio iphone ma ritorna con un messaggio di errore dove mi invita a spegnere il terminale e ricollegarlo tramite USB (che comunque non si risolve…)
    Volevo sapere se c’ entra con il discorso delle applicazioni firmate: ho letto che il software deve essere firmato e vi sono diverse procedure (tra cui http://developer.apple.com/documentation/Security/Conceptual/CodeSigningGuide/Procedures/chapter_3_section_2.html). Potresti darci un contributo su questo argomento
    Ciao e grazie

  12. Valkiry scrive:

    Sarà un caso che questa guida su iSpazio sia apparsa due giorni prima?? http://www.spaziocellulare.com/ispazio/2008/08/22/ispazio-rss-reader-ispazio-developer-program-2/

  13. Flagg scrive:

    bella guida, per chi copia-incollerà, fate attenzione, potrebbe capitarvi di incollare caratteri speciali tipo le virgolette ” strane ecc che ovviamente il compilatore non riconosce

    e attenzione anche che in alcuni punti l’impaginazione del blog manda a capo male, e ci si trova la fine di una riga appiccicata al inizio del altra, tipo ne ultimo blocco di codice:
    // Navigation logicint storyIndex ecc ecc
    in realtà è un:
    // Navigation logic
    int storyIndex ecc ecc

  14. I know this web site provides quality dependent content and extra stuff, is there any other website which
    gives these things in quality?

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: