Programming iOS lezione 4

2,415 views
2,342 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,415
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
36
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Programming iOS lezione 4

  1. 1. QUARTA LEZIONE
  2. 2. MenùUIWebViewAutenticazione su reteDebug delle AppApparire sullo storePubblicitàSaluti e baci finali
  3. 3. UIWebViewÈ il controller che si occupa della visualizzazione delle pagineWebSupporta HTML 5 e CSS 3Inoltre è in grado di eseguire codice JavaScriptSupporta le funzioni tap-to-zoom e pinch to zoom nativamenteHa funzioni per l’autocompleting dei formImplementa anche un riconoscimento dei paragrafi per lo zoom
  4. 4. Facciamo un piccolo esempioVogliamo realizzare un piccolo esempio con UIWebViewCi potrà decisamente tornare utile in futuroApriamo una View-Based ApplicationChiamiamola myStupidBrowserInstanziamo una UITextField e chiamiamola url nel file header
  5. 5. myStupidBrowser Istanziamo anche una UIWebView come IBOutlet Infine una IBaction e chiamiamola handleGoTapped: Dichiariamo la classe col protocollo UITextFieldDelegate #import <UIKit/UIKit.h>@interface myStupidBrowserViewController : UIViewController! ! ! ! <UITextFieldDelegate> {! IBOutlet UITextField *url;! IBOutlet UIWebView *webView;}-(IBAction) handleGoTapped;@end
  6. 6. Le solite modifiche in IBFare click su il nostro file xib all’interno del progettoAggiungiamo una UITextFiel nella ViewUn UIButton con il testo “GO” o “Vai”Una UIWebView che occupi la parte restante della viewIo ho anche personalizzato il campo testo con il mio sito
  7. 7. Soliti collegamentiFare right-click sul file’s OwnerCollegare url al campo di testoCollegate l’outlet webView alla UIWebViewCollegare infine l’azione handleGoTapped al pulsante “Go”Ma solo per l’evento Touch Up InsideRight-click su url e collegate il delegate al File’s Owner e salvate
  8. 8. Scriviamo i metodiNel file .m dovremo implementare una funzione chiamataloadURL:Questa funzione richiama la funzione loadRequest: diUIWebViewQuesto metodo richiede un NSURLRequest come argomentoQuindi allochiamo una URLRequest con la nostra url
  9. 9. Ora scriviamo il codice Scriveremo i seguenti tre metodi:-(void) loadURL {! NSURL *url = [[NSURL alloc] initWithString: urlField.text];! NSURLRequest *request = [[NSURLRequest alloc] initWithURL: url];! [webView loadRequest: request];! [request release];! [url release];}!- (BOOL)textFieldShouldReturn:(UITextField *)textField {! if (textField == urlField) {! ! [self handleGoTapped];! }! return YES;}-(IBAction) handleGoTapped {! [urlField resignFirstResponder];! [self loadURL];}
  10. 10. Veloci commenti a riguardoÈ stato richiamato il metodo resignFirstResponder:All’interno del metodo handleGoTapped: è richiamato loadURL:Come già visto textFielShouldRelease: serve per caricare l’URLAnche se è cliccato il bottone Return
  11. 11. RisultatoQuesto è come dovrebbe essere visualizzata l’applicazione nel simulatore..
  12. 12. AltroPotreste desiderare di implementare i bottoni avanti ed indietroPer fare questo basta implementare i metodi goBack: egoForward:Per indicare il caricamento della pagina, utilizzate il delegatoRiimplementate i metodi webViewDid{Start, Finish}Loading:Oppure didFailWithError: che sono i callback necessari
  13. 13. URL LOADING SYSTEM
  14. 14. URLNon tutto ciò che passa per la 80 è una pagina webMolte applicazioni si connettono per scaricare informazioniE reagire di conseguenzaPer questo Apple ha pensato all’URL Loading SystemConsente connessioni con quattro protocolli fondamentaliHTTP HTTPS FTP e FILE
  15. 15. RisultatoIl risultato è che possiamo facilmente utilizzare l’esempioprecedenteIn cui magari al posto di UIWebView abbiamo un campo di testoIn questo caso loadRequest: non è che l’inizio della sessioneNSURLConnection è l’oggetto di riferimentoSupporta POST, e GET sia per la ricezione che per l’invio
  16. 16. Altri dettagliLe proprietà POST e GET sono di sola letturaPer impostarle a valori differenti utilizzareNSMutableURLRequestUna corrispondente NSURLResponse è generata in seguitoNSURLConnection rappresenta l’azione di connettersi al servere di ottenere rispostaL’interazione avviene in modo asincrono (ma anche sincrono)
  17. 17. Vediamo come funziona NSURLRequest *request = [[NSURLRequest alloc] initWithURL: url];! NSURLConnection *connection = [[NSURLConnection alloc]! ! ! ! ! initWithRequest:request! ! ! ! ! delegate:self];! [connection release];! [request release]; NSURLConnection ha come delegato se stesso È per questo che possiamo rilasciare gli oggetti subito Al delegato viene notificato qualsiasi evento interessante Chiaramente gestiremo l’autenticazione tramite questo oggetto
  18. 18. Alcuni dei callbackconnection:didReceiveResponse: sono ricevuti dati sufficienticonnection:didReceiveData: fornisce un wrapper NSDataattorno al più recente blocco di byteconnection:didFinishLoading: il download è stato completatoconnection:didFailWithError: restituisce un NSError perdescrivere perché è fallito il downloadPer far vedere il caricamento usate il metodo [UIActivityIndicatorView startAnimating]
  19. 19. Ancora sui callbackUna volta ricevuta la risposta, potete mettere in stop la rotellinaCercare all’interno della risposta quello che vi interessaNel caso in cui abbiamo una risposta di tipo JSON cicomportiamo come visto nella lezione precedenteAltre idee sono utilizzare una UIProgressViewImpostare il suo valore in base a expectedContentLenght eaggiornarla periodicamente
  20. 20. Chi ci interessa?L’evento che c’interessa di più è connection:didReceiveData:Qualunque cosa decidiate di fare con i dati......Fatela qua!Viene chiamato ogni qualvolta verrà raggiunta la fine del flusso
  21. 21. Andiamo a vedere il codice Andiamo a creare un facile esempio, creiamo una NSString e aggiungiamo ad un UITextView - (void)connection:(NSURLConnection *)connection! ! ! ! ! didReceiveData:(NSData *)data {! NSLog (@"connectionDidReceiveData");! NSString *newText = [[NSString alloc]! ! ! ! initWithData:data! ! ! ! encoding:NSUTF8StringEncoding];! if (newText != NULL) {! ! [self appendTextToView:newText];! ! [newText release];! }}
  22. 22. AltroGli altri due eventi che dovrete gestire sono rispettivamente gli eventi di fine gli eventi di errorePer questo motivo vediamo nello specifico cosa possiamo fareIn generale potete sicuramente gestire il comportamento dellaUI
  23. 23. Tutto qui?La cosa più straordinaria è che è tutto quiNessun controllo di connessioneNessun dettaglio di cui occuparsiInoltre lavoriamo completamente in asincroniaCol metodo sendSynchronousRequest:returningResponse:errorSi può anche forzare la modalità di blocco
  24. 24. Autenticazione HTTPPer adesso non possiamo accedere a risorse protette da passwordLe richieste di contenuti in un realm protetto rispondono con uncodice HTTP 401 (Non autorizzato)Fortunatamente abbiamo la possibilità di gestirla con URLLSMa per fare questo dobbiamo creare in due passi un realmprotettoIl Mac in questo ci viene in aiuto
  25. 25. Impostiamo il RealmOgni Mac dispone di Apache, che useremo per il testApriamo Preferenze->Condivisione->Condivisione WebSe non è ancora attivo premiamo StartAnnotate l’indirizzo del vs. computer, sarà utileLa Root del webserver è in /Library/WebServer/Documents/Create una cartella e chiamatela iPhone
  26. 26. Creiamo la paginaOra con un editor di testo creiamo una pagina index.htmlAll’interno della pagina in HTML scriviamo questo codice<html><head><title>Ok!</title></head><body><h1>YoureIn!</h1><img src="FileSystemExplorer-app-dir.png" /></body></html>
  27. 27. Blocchiamo l’accessoOra dovremo bloccare l’accesso alla paginaPer fare questo modifichiamo i file di configurazione di Apache2Apriamo un TerminaleSpostiamoci su /etc/apache2/A questo punto apriamo il file con sudo vi httpd.confAndate alla fine del file per inserire i seguenti codici
  28. 28. Modifica di Apache#Aggiunge un vhost per autenticare la directory iphoneInclude /etc/apache/users/*.confPassate alla cartella qui di sopra dopo aver salvato il fileCreate un nome qualsiasi di file con estensione .confAll’interno di questo file dichiariamo le informazioni diautenticazione
  29. 29. iphone.conf## Autenticazione utente/password per directory iphone#<Directory "/Library/WebServer/Documents/iphone">! AuthType Basic! AuthName "Autentica o Muori"! AuthUserFile /etc/apache2/iphonoedirpasswd! Require user zack</Directory>Indichiamo la cartella, indichiamo il tipo di autenticazioneIn questo caso forniremo username/passwordIndichiamo il file con la password, e i nomi degli utenti
  30. 30. Creiamo il file di passwordUna volta fatto questo file dobbiamo generare un file di htpasswdCreiamo un utente con htpasswd da superusersudo htpasswd -c /etc/apache2/iphonedirpasswd zackCi verrà chiesta la password e la confermaRiavviate Apache con sudo apachectrl restartAndate a vedere se l’autenticazione è riuscita col browser
  31. 31. Gestire l’autenticazione HTTPOra dovremo gestire l’autenticazione tramite URLLSIn questo caso l’autenticazione è gestita dal metodo di callbackdel delegato connection:didReceiveAuthenticationChallenge:Questa restituisce un oggetto NSURLAuthenticationChallengeQuesto rappresenta lo stato del challenge tra domanda e rispostaPotete chiamare quindi diversi metodi per gestire la connessione
  32. 32. MetodiIl metodo sender restituisce un oggettoQuesto oggetto implementa il protocolloNSAuthenticationChallengeSenderQuesto rappresenta il mittente con cui stabilite una connessioneÈ con questo che andrete ad interagire quando vi autenticate
  33. 33. Varie opzioniPotete fare diverse cose una volta individuato il sender O rispondere con user/password (useCredential:ForAuthenticationChallenge:) Oppure continuare senza fornire credenziali (continueWithoutCredentialsForAuthenticationChallenge:) Oppure rinunciare e annullare la ricerca (cancelAuthenticationChallenge:)
  34. 34. Prova pratica - (void)connection:(NSURLConnection *)connection! didReceiveAuthenticationChallenge:! (NSURLAuthenticationChallenge *)challenge {! if ([challenge previousFailureCount] != 0) {// Se la precedente sessione ha count > 0, allora user e password erano errate! ! NSString *alertMessage = @"Invalid username or password";! ! UIAlertView *authenticationAlert =! ! [[UIAlertView alloc] initWithTitle:@"Authentication failed"! ! ! ! message:alertMessage! ! ! ! delegate:nil! ! ! ! cancelButtonTitle:@"OK"! ! ! ! otherButtonTitles:nil];! ! [authenticationAlert show];! ! [authenticationAlert release];! ! [alertMessage release];! ! [activityIndicator stopAnimating];! } else {! ! // show and block for authentication challenge! ! AuthenticationChallengeViewController *challengeController =! ! [[AuthenticationChallengeViewController alloc]! ! ! ! initWithNibName:@"AuthenticationChallengeView"! ! ! ! bundle:[NSBundle mainBundle]! ! ! ! loader: self! ! ! ! challenge: challenge];! ! [self presentModalViewController:challengeController! ! ! ! animated:YES];! ! [challengeController release];! }}
  35. 35. Commentiamo il codiceSe il numero di tentativi falliti è >0Allora abbiamo sbagliato user/passQuindi presentiamo un messaggio di erroreNel caso invece di un nuovo ChallengeVisualizziamo una finestra con la richiesta di tipo modale
  36. 36. Ancora sul codiceL’AuthenticationViewController è una semplice viewÈ composta da tre UILabels, due per il nome/cognome, una peril titoloDue bottoni, uno per Annulla, l’altro per OKEntrambi i metodi dismettono la view modale e recuperano ilNSURLAuthenticationChallengeSender dal challengeLa differenza è Annulla invia cancelAuthenticationChallenge:
  37. 37. Gestire l’autenticazione Notiamo il metodo handleAutentication - (void) handleAuthenticationOKForChallenge:! ! ! (NSURLAuthenticationChallenge *) aChallenge! ! ! withUser: (NSString*) username! ! ! password: (NSString*) password {! // try to reply to challenge! NSURLCredential *credential = [[NSURLCredential alloc]! ! ! initWithUser:username! ! ! password:password! ! ! persistence:NSURLCredentialPersistenceForSession];! [[aChallenge sender] useCredential:credential! ! ! forAuthenticationChallenge:aChallenge];! [credential release];! [self dismissModalViewControllerAnimated:YES];}
  38. 38. SpieghiamoViene allocato un oggetto di tipo NSURLCredentialsQuesto richiede un argomento persistance: NSCredentialsPersistanceNone NSCredentialsPersistanceForSession NSCredentialsPersistancePermanent Solo quest’ultima ha comportamenti diversi su iphone e simulatore
  39. 39. Ok for Challenge - (void) handleAuthenticationOKForChallenge:! ! ! (NSURLAuthenticationChallenge *) aChallenge! ! ! withUser: (NSString*) username! ! ! password: (NSString*) password {! // try to reply to challenge! NSURLCredential *credential = [[NSURLCredential alloc]! ! ! initWithUser:username! ! ! password:password! ! ! persistence:NSURLCredentialPersistenceForSession];! [[aChallenge sender] useCredential:credential! ! ! forAuthenticationChallenge:aChallenge];! [credential release];! [self dismissModalViewControllerAnimated:YES];}
  40. 40. ComportamentoOra abbiamo praticamente finitoSe le credenziali sono state accettate iniziamo a riceverechiamate connection:didReceiveData:Queste contengono il contenuto dell’URL a cui abbiamoottenuto l’accessoNel nostro caso trattasi di un file HTMLGli altri metodi sono forniti con l’esempio
  41. 41. APPLICAZIONI PRONTE PER LO STORE
  42. 42. E adesso?La mia applicazione è prontaVorrei inserirla nell’App StoreE venderlaMa non so come fareE adesso?
  43. 43. RequisitiIl nostro codice deve essere stabileDobbiamo essere all’interno del programma iOS DevelopersHa un prezzo di €79,00 annualiPuò essere fatto da privati o aziendeConsente di testare il software sino a 100 dispositiviPrima di inviarlo a Apple il codice deve essere testato
  44. 44. Fare delle scelteCome al solito è necessario fare alcune scelte di carattereprogettualeUna di queste è fare o meno un’applicazione UniversalQuesta girerà sia su iPad che su iPhoneHa bisogno di ripensare l’interfaccia grafica in ambedue i casiAnche le azioni saranno differenti
  45. 45. Alcuni accorgimentiSe volete fare un’applicazione per iPadDimenticate di fare un clone di quella per iPhoneIl dispositivo è totalmente differenteVa rivista tutta la UI e la possibilità di inserire dei nuovi elementiLe app per iPad hanno un differente approccioTenete presente che avete un dispositivo che ruota
  46. 46. Cosa sì e cosa noSaranno respinte: App non complete o che crashan App che non fanno quello che dicono di fare Quelle che usano API non pubbliche Quelle che usano funzionalità non documentate App in beta, trial o demo
  47. 47. Cosa sì e cosa noApp che sono presenti in massa con le stesse funzionalità (tiporutti, scorreggie, Kamasutra)Devono girare anche in 2X su iPadQuelle che non offrono funzionalità ma sono specifiche di un sitoWebNon possono contenere frasi offensive o incitazione alla violenzaNon possono essere limitanti nella fruizione
  48. 48. Poi non venitemi a dire..Non possono replicare funzionalità del sistema operativoNon vale spammare l’App Store con App tutte similiApp con Rating inappropriato saranno rimosseNo porno, no violenza o razzismoLe applicazioni di raccolta fondi devono essere free
  49. 49. Il successo di un’AppChe cosa porta al successo di un’App?Forse la grafica?Forse la funzionalità?Forse la pubblicità?Forse l’icona?In realtà un po’ tutte queste cose...
  50. 50. ProgettazioneButtarsi a capofitto su Xcode non è mai una buona ideaNotti di riscrittura del codice vi attendonoOgni modifica in corso d’opera ha un altissimo costoDefinite una proposizione che descrive l’applicazioneTracciate un prototipo su carta (sì carta!)Definite un ADS (Application Definition Statement)
  51. 51. ADSUn ADS è una frase che serve per spiegare cosa farà l’AppAiuta a prendere decisioni su caratteristiche ed elementi della UIL’applicazione diventa molto più centrata e definitaUn buon ADS è composto da 3 parti Elemento distintivo, soluzione, tipo di utenza
  52. 52. Elemento distintivoÈ ciò che rende speciale la vostra applicazioneSarà “facile da usare?”Consente di differenziare la vostra applicazione rispetto alle altrePuò anche essere “graficamente appagante” o “funzionale”Decidete voiPiù sarete specifici meglio sarà
  53. 53. SoluzioneLa soluzione definisce il problema che voi volete risolvere con lavostra applicazionePer esempio può servire a condividere le vostre fotoDa questo momento in poi quello sarà l’obiettivo dell’AppNull’altro vi deve distogliere dall’obbiettivo
  54. 54. Tipo di utenzaDefinisce l’utente finale della vostra applicazioneL’app delle foto serve per professionisti o per bambini?Conoscendo l’utenza conoscerete anche il tipo di caratteristicheInutile fornire funzioni avanzate se il target è un bambinoQuesto si riflette anche sull’interfaccia utente
  55. 55. TempiTeoricamente potreste passare anche due settimane nelladefinizione delle ADSSenza neanche scrivere una riga sola di codiceMa questo non vi deve scoraggiare perché avrete sicuramente intesta con precisione cosa realizzareTroppo spesso dipo 100 righe di codice ti rendi conto che lametafora non era quella corretta
  56. 56. Il dubbioQuando si perde di vista l’obiettivo quello che succede è: O riscrivo da zero l’applicazione O rivedo la metafora dell’applicazioneIn ciascuno dei due casi abbiamo fallito l’obiettivo
  57. 57. Progettare con matitaNon usate OmniGraffleUsare la matitaMetter per iscritto le proprie idee non imparare le astuzie perottenere un progetto dalla grafica perfettaSchematizzare in fogli grandi una schermataServe anche agli utenti per vedere l’aspetto dell’interfaccia
  58. 58. DisegnareQuando trovate pezzi di interfaccia che non funzionanoButtare la carta e creare subito un altro schemaIdee economiche che vengono buttate via se non funzionanoInvestire tempo in “cose importanti”Condividete e rivedete, coinvolgete quante più persone possibileAvrete un feedback per facilitarvi la creazione dell’interfaccia
  59. 59. Usate la rotazioneFate anche sempre delle prove sul dispositivo in tutte leorientazioniLa genta adora utilizzare l’app in qualunque orientazioneFate quindi un layout coerente in tutte le orientazioniOra è arrivato il momento di pensare in maniera creativaDovete inserire qualcosa che faccia parlare della vostra App
  60. 60. Fattore WOW!™Il Fattore WOW!™ è quello che fa parlare le personeNon appena aperta l’applicazione chi la usa deve rimanerecolpitoUn utilizzo creativo di uno shake del dispositivoOppure un’integrazione con i social networkUn evento inaspettato durante l’uso (coerente con lageolocalizzazione ad esempio)
  61. 61. Pensate sempre all’utenteLa caratteristica primaria non deve perdere di vista l’utenteÈ lui il destinatario, non deve diventare fattore d’ingombroNon deve distrarci dallo scopoLo scossone è davvero utile?Gli utenti sanno come avviarloEsiste una funzione alternativa?
  62. 62. Otteniamo FeedbackUn altro fondamentale step è chiedere un feedback agli utentiSpesso gli utenti hanno un sacco di idee che a voi non sonovenute in menteSaprete sicuramente cosa eliminareQuali aggiustamenti introdurreQuali funzionalità incorporare
  63. 63. Occhio però...Non perdere di vista l’obiettivo primario La vostra applicazione deve rendere più facile la vita Non certo complicarla con inutili fronzoli Occhio a non farsi trasportare all’effetto contrario
  64. 64. PerfezionamentoPrima del test agli utenti c’è una parte da non sottovalutareFacciamo un passo indietro e cerchiamo le parti da perfezionareRendere l’applicazione priva d’intoppi e semplice Facciamoci delle domande come la seguente: Come vengono gestite le telefonate e le interruzioni? Le caratteristiche sono facili da trovare e utilizzare?
  65. 65. PerfezionamentoQual’è il profilo d’uso percepito, l’applicazione si avviavelocemente?Alcune aree dellapplicazione utilizzano più energia del dovuto?Anche se non esiste una risposta, è importante porseleGli utenti apprezzano realmente un buon lavoroAggiungere uno splash screen è utile in questo frangente
  66. 66. Gestite le interrruzioniPotete decidere di salvare lo stato dell’applicazione ad ognilancioPotete accedere ad SQLite per salvare lo stato dell’applicazioneRicordate infine di scegliere l’icona in maniera coerente conl’applicazione e ben definitaValutate l’introduzione di notifiche push ma siate accorti nel lorouso possono diventare molto invadenti
  67. 67. Beta testerIl beta testing è la parte più importante dell’applicazioneÈ necessario ascoltare i beta tester e sentire le lamenteleSe tutti danno feedback positivi allora c’è qualcosa che non vaProcuratevi dei profili di distribuzione ad hoc in base all’IDUna volta finito il tempo del test (anche alcune settimane)prendere i dati tramite Organizer dell’applicazione
  68. 68. Non esagerate con i fixSembra paradossale ma l’applicazione dovrà essere prontaIn realtà l’applicazione disponibile batte sempre quella perfettaOra potete affermare di voler arrivare al negozio senza temereCi sono ottime probabilità che la vostra applicazione vengaaccettataRisolvete gli aspetti legali della vostra posizione tipo IVA etc.
  69. 69. Altre cose da fareRiportate firmati i contratti ad AppleBisogna essere pazienti e questa prassi dura parecchioQuando si dice che non si possono utilizzare API private è cosìLa vostra applicazione viene rifiutata perché Apple non sa cosac’è dentroPer quanto ne sanno loro le vs. librerie potrebbero danneggiare ildispositivo
  70. 70. Se ottenete un rifiutoNON suicidarsiTutti hanno visto rifiutarsi delle App (anche Google)Fare un respiro profondoChiedersi come maiSe il motivo vi risulta infondatoRipresentate il progetto, non prenderlo come un fatto personale
  71. 71. DiffusioneLa diffusione è fondamentale, ma è un lavoro a tempo pienoDiffondete la rete di link al vostro sito, comunicati stampaRecensioni su iTunes di beta testerFondamentale è anche il supportoCercate di venire in aiuto degli utenti in difficoltàBuona fortuna!
  72. 72. Thank you for developing for iOS. Even though thisdocument is a formidable list of what not to do, please alsokeep in mind the much shorter list of what you must do.Above all else, join us in trying to surprise and delight users.Show them their world in innovative ways, and let theminteract with it like never before.In our experience, users really respond to polish, both infunctionality and user interface. Go the extra mile. Givethem more than they expect. And take them places wherethey have never been before. We are ready to help.
  73. 73. GRAZIE DELL’ATTENZIONE!

×