8. Background fetch
•
Basta attese di download nuovi
dati (o quasi)
•
Download nuovi dati in
background (UP -> DL -> BG)
•
iOS7 impara quando effettuare
un fetch
•
Utile per app di news, social
networks, meteo, photo sharing
9. Background fetch - Step one
•
Abilitare background fetch (direttamente
da XCode 5, Progetto/Capabilities)
10. Background fetch - Step one
•
E’ importante abilitare solo ciò che serve,
•
Apple non accetta app con opzioni
inutilizzate
11. Background fetch - Step two
•
Impostare l’intervallo di fetch
nell’AppDelegate in
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
•
Di default è UIApplicationBackgroundFetchIntervalNever
•
[application
setMinimumBackgroundFetchInterval:UIApplicat
ionBackgroundFetchIntervalMinimum];
13. Background fetch - Step three
•
Implementare nell’AppDelegate il metodo
application:performFetchWithCompletionHandler:
• UIBackgroundFetchResultNewData: se ci sono nuovi
dati, ricordarsi
di aggiornare la UI
•
UIBackgroundFetchResultNoData: se non ci sono nuovi
dati
•
UIBackgroundFetchResultFailed: se si è avuto un errore
14. Background fetch - Step three
•
Una richiesta fetch non può durare più di 30
secondi fino al completionHandler altrimenti
time out della richiesta
•
Non abusarne, scaricare solo piccoli dati
Quando una fetch è quasi conclusa:
•
Incrementare il badge/usare notifiche locali
•
Richiamare il completionHandler
15. Background fetch - Debug
•
Simulare il background fetch
•
Abilitare l’opzione “Launch due to a
background fetch event” (nello schema
della app)
17. Silent notifications
•
Sono notifiche… silenziose!
•
Permettono di avviare un
download di un nuovo contenuto
non troppo corposo
•
Il sistema sveglia la app (se
necessario), processa la notifica
(avvia il download) ed infine sta a
noi notificare l’utente.
18. Silent notifications - Step one
•
Abilitare remote notifications
(direttamente da XCode 5,
Progetto/Capabilities)
19. Silent notifications - Step one
•
E’ importante abilitare solo ciò che serve,
•
Apple non accetta app con opzioni
inutilizzate
20. Silent notifications - Step two
•
Come per le push notification, vanno
registrate le notifiche nell’AppDelegate in
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
•
[application
registerForRemoteNotificationTypes:UIRemoteNotifi
cationTypeBadge | UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeSound];
21. Silent notifications - Step two
•
Implementare nell’AppDelegate il metodo
application:didReceiveRemoteNotification:fetchC
ompletionHandler:
• UIBackgroundFetchResultNewData: se ci sono nuovi
dati, ricordarsi
di aggiornare la UI
•
UIBackgroundFetchResultNoData: se non ci sono nuovi
dati
•
UIBackgroundFetchResultFailed: se si è avuto un errore
22. Silent notifications - Step three
•
Una push notification o silent notification,
è un JSON
•
Una silent notification è una push
notification con contenuto:
content-available : 1
24. Silent notifications - Step three
•
Una richiesta fetch non può durare più di 30
secondi fino al completionHandler altrimenti time out
della richiesta
•
Non abusarne, scaricare solo piccoli dati
•
Non sempre sono consegnate appena inviate
•
Troppe silent notification sono messe in coda e
consegnate insieme
•
Una push notification può essere anche una silent
notification? Sì, purché abbia content-available = 1
25. Silent notifications - Step three
Quando una silent notification è quasi
conclusa:
• Incrementare
locali
• Richiamare
il badge/usare notifiche
il completionHandler
26. Silent notifications - Debug
•
Inviare una silent notification tramite
servizi tipo Parse.
Ovviamente prima si devono configurare
Parse e la app per poter attivare le push
notification.
28. Background transfer service
•
Permette di trasferire grossi
file
•
Niente limite dei 10min come
in iOS6
•
iOS sveglia la app per gestire
i trasferimenti.
29. Background transfer service
•
I trasferimenti continuano anche se viene
messa la app in background
•
La app include una “Progress View”
•
E’ basato sulla classe NSURLSession (iOS7)
Questa classe trasferisce dati via HTTP o
HTTPS
•
Una sessione gestisce tutti i tasks relativi ai
trasferimenti di dati.
30. NSURLSession - benefits
•
Upload e download su thread in
background
•
Possibilità di mettere in pausa, stoppare e
far ripartire un session task
•
Configurazione unica per la sessione
(NSURLSessionConfiguration)
•
Gestione della autenticazione in base alla
specifica connessione
31. NSURLSession - Step one
•
NSURLSessionTask è la classe base
per i task nella session
32. NSURLSession
•
NSURLSessionTask è la classe base per i
task nella session
•
NSURLSessionDataTask:
GET HTTP => NSData
•
NSURLSessionUploadTask:
NSData/File Stream => POST/PUT HTTP
•
NSURLSessionDownloadTask:
leggermente diversa dalle precedenti
33. NSURLSessionDownloadTask
•
Task che lavora direttamente su file temp
•
Durante il download viene aggiornato lo
stato del trasferimento (progress view)
•
Al termine del download è possibile salvare
il file temp in una location permanente
•
Supporta il resume del download
34. NSURLSessionDownloadTask - Step
one
•
Definire NSURLSessionConfiguration
=> defaultSessionConfiguration
•
Definire NSURLSession
•
Definire NSURLSessionDownloadTask
(dall’istanza della session)
•
Implementare il protocollo (interfaccia)
desiderato
35. NSURLSessionDownloadTask Step two
•
I protocolli per le NSURLSession
implementano il protocollo
NSURLSessionDelegate
•
NSURLSessionDownloadDelegate è il
protocollo che utilizziamo
•
NSURLSessionDownloadDelegate ha tre
metodi @required (obbligatori)
38. Background transfer service - Step
one (come prima)
•
Definire NSURLSessionConfiguration
=> backgroundSessionConfiguration (con ID univoco)
•
Definire NSURLSession (usando il singleton)
•
Definire NSURLSessionDownloadTask (dall’istanza
della session)
•
Implementare il protocollo (interfaccia) desiderato
39. Background transfer service Step two (come prima)
•
I protocolli per le NSURLSession
implementano il protocollo
NSURLSessionDelegate
•
NSURLSessionDownloadDelegate è il
protocollo che utilizziamo
•
NSURLSessionDownloadDelegate ha tre
metodi @required (obbligatori)
40. Background transfer service Step three
•
Implementare il metodo
(void)URLSessionDidFinishEventsForBackgroundURLSessi
on:(NSURLSession *)session
•
Se l’app non è in foreground, sveglia l’app e
comunica il termine degli eventi in
background per una determinata session,
avvisando l’AppDelegate
41. Background transfer service Step three
•
Nell’AppDelegate implementare il metodo
-(void)application:(UIApplication *)application
handleEventsForBackgroundURLSession:(NSString
*)identifier completionHandler:(void (^)
())completionHandler
•
Metodo chiamato quando tutti i
trasferimenti di background, associati ad
una NSURLSession, sono completati o
falliti. Viene chiamato prima del
NSURLSession delegate.
42. Background transfer service Step three
•
Nell’AppDelegate implementare la
property
@property (copy) void
(^backgroundSessionCompletionHandler)();
•
È l’handler delle
BackgroundURLSession, necessario per
richiamare l’NSURLSessionDelegate
46. iOS7 - Dynamic
•
Apple incoraggia la costruzione di
UI che permettano di percepire la
realtà
•
Non è necessario conoscere
OpenGL
•
g = 9,8ms
•
dist_oggetto = 0.5 x g x tempo^2
2
47. Dynamic - Nuovi tools
•
UIKit Dynamics: motore fisico
integrato in UIKit. Gestisce
gravità, elasticità e forze.
•
Motion Effects: permette di
realizzare effetti di parallasse,
legati al movimento del
device
48. UIKit Dynamics
•
UIDynamicAnimator è il motore fisico di
UIKit, tiene traccia dei comportamenti
aggiunti al motore
•
Come riferimento ha una UIView (di solito
self.view) che sfrutta per definire il proprio
sistema di coordinate
49. UIKit Dynamics
•
La formula per la distanza degli oggetti
resta la stessa dist_oggetto = 0.5 x g x
tempo^2
•
Però, anziché lavorare con i metri, UIKit
Dynamics lavora con le migliaia di pixel
(per secondo quadrato)
50. UIKit Dynamics
•
UIGravityBehavior modella il comportamento
della gravità su uno o più item
•
Ad esso è associato un insieme di item
(UIView) influenzati da questo
comportamento
•
Proprietà gravitazionali: contiene proprietà
che influenzano la forza di gravità (es.
magnitude)
52. UIKit Dynamics
•UICollisionBehavior
definisce uno o più
confini per la collisione
UICollisionBehavior *collision = [[UICollisionBehavior
alloc] initWithItems:@[self.theBomb]];
collision.translatesReferenceBoundsIntoBoundary =
YES;
[animator addBehavior:collision];
53. UIKit Dynamics
•UICollisionBehavior
definisce uno o più
confini per la collisione
UICollisionBehavior *collision = [[UICollisionBehavior
alloc] initWithItems:@[self.theBomb, self.theTank]];
collision.translatesReferenceBoundsIntoBoundary =
YES;
[animator addBehavior:collision];
Niente più attese di download dei dati all’apertura della app; Immaginate una app aperta la scorsa settimana e riaperta oggi, il tutto con una connessione 3g scadente….
Il download dei nuovi dati in background, sveglia la app, aggiorna i dati, addormenta la app. Il tutto in maniera nascosta all’utente.
E’ possibile scegliere quando fare delle chiamate fetch ad intervalli ti tempo.
Apple raccomanda di non eseguire chiamate fetch molto spesso per evitare consumi eccessivi della batteria.
iOS7 vede quando e quali app sono usate più spesso e, prima che l’utente le usi, ne richiama un aggiornamento fetch così che l’utente che ad esempio apre facebook tutti i pomeriggi, possa ritrovarsi l’applicazione sempre aggiornata.
Abilitare Background fetch in XCode 5 (project/capabilities)
Questo aggiunge nel plist il background mode fetch.
Ora bisogna impostare l’intervallo in cui deve essere eseguito il fetch
Di default il valore è a “mai” UIApplicationBackgroundFetchIntervalNever. Se non lo si cambia, il fetch non funziona!
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
Puoi impostare un intervallo anche custom, tramite un NSTimerInterval, ma è sempre meglio lasciare decidere ad iOS e lasciare UIApplicationBackgroundFetchIntervalMinimum (che NON definisce un tempo, è iOS7 ha decidere quando, in base alle risorse, batteria, ecc… effettuare il fetch).
Il delegato application:performFetchWithCompletionHandler: è chiamato ogni volta che un background fetch è effettuato.
L’handler accetta 3 tipi di risultati:
UIBackgroundFetchResultNewData: se ci sono nuovi dati
UIBackgroundFetchResultNoData: se non ci sono nuovi dati
UIBackgroundFetchResultFailed: se si è avuto un errore
Se una richiesta, completionHandler incluso, dura più di 30 secondi, l’app torna in sleep, sospesa, senza aggiornamento.
E’ possibile simulare un background fetch da XCode (Debug/Simulate Background Fetch), avendo il dispositivo o il simulatore in debug.
Oppure, più esaustivo, testare la app in background duplicando lo schema e abilitandovi, nella voce RUN/options, il Background Fetch (it allows you to test the app while it remains in the background).
Nessuno avrà mai bisogno di una memoria maggiore di 640Kb su un pc. Bill Gates 1981
Moriremo tutti. Maya
Aiuta:
il download di contenuti corposi come video, podcast, ecc…;
la sincronizzazione di contenuti;
aggiornamenti sporadici per cui un background fetch sarebbe eccessivo.
Quando si riceve una silent notification, il sistema silenziosamente sveglia la app che così può gestire la notifica; la notifica quindi è responsabile dell’avvio del download di nuovi contenuti. Quando il download termina, si può inviare una local notification o aggiornare il badge.
Così, quando l’utente avvia la app, il contenuto è lì ad aspettarlo.
Abilitare Remote notifications in XCode 5 (project/capabilities)
Questo aggiunge nel plist il remote-notification mode.
Immaginiamo che l’utente sia iscritto ad un canale di ricette. Con le push notification possiamo avvisare l’utente che una nuova ricetta è online, l’utente vede la push notification (sempre se ha disattivato le notifiche dalla nostra app), tocca la notifica, attende che la app si apra, attende il download della ricetta (che può essere lungo) ed infine, premesso tutto questo, può vederla.
Come possiamo ottenere nuovi contenuti quando disponibili, evitando attese per l’utente? La silent notification fa al caso nostro.
Il delegato application:didReceiveRemoteNotification:fetchCompletionHandler: è chiamato ogni volta che si riceve una silent notification.
L’handler accetta 3 tipi di risultati:
UIBackgroundFetchResultNewData: se ci sono nuovi dati
UIBackgroundFetchResultNoData: se non ci sono nuovi dati
UIBackgroundFetchResultFailed: se si è avuto un errore
Se una richiesta, completionHandler incluso, dura più di 30 secondi, l’app torna in sleep, sospesa, senza aggiornamento.
E’ possibile simulare un a silent notification mettendo l’app in background e inviando una silent notification
PER PARSE => { "content-available": 1, "sound": ""}
con servizi tipo Parse
Che bisogno ha una persona di tenersi un computer in casa? Kenneth Olsen, 1977
Beatles? La loro musica non funziona. Decca Records, 1962
PER PARSE => { "content-available": 1, "sound": ""}
Trasferimenti e ciò che ne comporta come autenticazioni, errori, completamenti.
NSURLSession è migliore di NSURLConnection. Aiuta il trasferimento di grossi file.
Configurazione unica per la sessione: ogni NSURLSession è il container configurabile nel quale poter inserire le richieste. Se ad es. va impostato l’header HTTP, basta aggiungerlo una sola volta e ogni richiesta nella sessione avrà la stessa configurazione.
Ci sono tre modi per creare una NSURLSessionConfiguration:
•defaultSessionConfiguration – crea un oggetto configurazione che usa la cache globale, cookies e oggetti per la memorizzazione delle credenziali. Questa è la configurazione che rende la sessione simile a NSURLConnection.
•ephemeralSessionConfiguration – per sessioni “private” e non ha memoria persistente di cache, cookie o credenziali.
•backgroundSessionConfiguration – da usare quando si vuole effettuare una chiamata da push notifications remote o mentre l’app è sospesa.
NSURLSessionTask è la classe base per i task nella session; questi possono solo essere creati da una sessione e possono essere istanze di una delle seguenti sottoclassi.
NSURLSessionDataTask
Questo task effettua una richiesta HTTP GET per recuperare dati dal server. I dati ritornano come NSData.
NSURLSessionUploadTask
Usate questa classe quando avete bisogno di uploadare qualcosa al web service usando HTTP POST o PUT. Il delegate per i task permette poi di controllare il traffico di rete durante la trasmissione.
NSURLSessionDownloadTask rende super-facile scaricare file da servizi remoti e, volendo, mettere in pausa e far ripartire il download. Questa sottoclasse è leggermente differente dalle altre due.
NSURLSessionDownloadTask rende super-facile scaricare file da servizi remoti e, volendo, mettere in pausa e far ripartire il download. Questa sottoclasse è leggermente differente dalle altre due.
•Questo tipo di task scrive direttamente su file temporanei.
•Durante il download, la sessione chiamerà URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite: per aggiornare lo stato del trasferimento dati.
•Quando il task è finito viene chiamato URLSession:downloadTask:didFinishDownloadingToURL:. Questo metodo è dove voi potete salvare il file dalla location temporanea ad una permanente.
•Quando il download fallisce o viene cancellato potete ottenere i dati per far ripartire il download.
Ci sono tre modi per creare una NSURLSessionConfiguration:
•defaultSessionConfiguration – crea un oggetto configurazione che usa la cache globale, cookies e oggetti per la memorizzazione delle credenziali. Questa è la configurazione che rende la sessione simile a NSURLConnection.
•ephemeralSessionConfiguration – per sessioni “private” e non ha memoria persistente di cache, cookie o credenziali.
•backgroundSessionConfiguration – da usare quando si vuole effettuare una chiamata da push notifications remote o mentre l’app è sospesa.
Andiamo a vedere il download e l’upload.
HOW TO: creare e configurare una NSURLSessionConfiguration (scegliendo una delle tre modalità viste sopra); creare una NSURLSession in base alla NSURLSessionConfiguration appena creata; creare un NSURLSessionDownloadTask partendo dalla NSURLSession; implementare il protocollo desiderato.
Il primo è chiamato quando il download è completato. L’utente deve muovere il file scaricato in una nuova location poiché il file temporaneo di download, viene cancellato al return del metodo;
Il secondo, notifica periodicamente il progresso del download;
Il terzo, è chiamato quando un download è riesumato.
Ci sono tre modi per creare una NSURLSessionConfiguration:
•defaultSessionConfiguration – crea un oggetto configurazione che usa la cache globale, cookies e oggetti per la memorizzazione delle credenziali. Questa è la configurazione che rende la sessione simile a NSURLConnection.
•ephemeralSessionConfiguration – per sessioni “private” e non ha memoria persistente di cache, cookie o credenziali.
•backgroundSessionConfiguration – da usare quando si vuole effettuare una chiamata da push notifications remote o mentre l’app è sospesa.
Andiamo a vedere il download e l’upload.
HOW TO: creare e configurare una NSURLSessionConfiguration (scegliendo una delle tre modalità viste sopra); creare una NSURLSession in base alla NSURLSessionConfiguration appena creata; creare un NSURLSessionDownloadTask partendo dalla NSURLSession; implementare il protocollo desiderato.
E' un metodo importantissimo per il Background Transfer Service.
Se l’app non è in foreground, sveglia l’app e comunica il termine degli eventi in background per una determinata session.
Richiama inoltre nell’AppDelegate l’handler, il gestore, (handleEventsForBackgroundURLSession) delle BackgroundURLSession (vedi diapositiva successiva)
Metodo chiamato quando tutti i trasferimenti di background, associati ad una NSURLSession, sono completati o falliti
Proprietà gestita dal metodo (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session della diapositiva precedente
Metodo chiamato quando tutti i trasferimenti di background, associati ad una NSURLSession, sono completati o falliti
Download BTS, app in background, completamento download, riapro app e c’è l’immagine;
forza gravità g
distanza oggetto dist oggetto
•UIKit Dynamics è un motore fisico integrato in UIKit. Permette di creare interfacce intrise di elementi reali come la gravità, oggetti elastici e diversi tipi di forze. Dovrete definire quindi delle componenti fisiche che la vostra interfaccia dovrà adottare e il motore fisico farà il resto.
•Motion Effects permette di creare incredibili effetti di parallasse come quelli che vedere nella home di iOS7 quando eseguite il tilt. In pratica potrete utilizzare alcuni valori forniti dall’accelerometro del telefono per creare interfacce che reagiscono ai movimenti fisici del telefono.
•UIKit Dynamics è un motore fisico integrato in UIKit. Permette di creare interfacce intrise di elementi reali come la gravità, oggetti elastici e diversi tipi di forze. Dovrete definire quindi delle componenti fisiche che la vostra interfaccia dovrà adottare e il motore fisico farà il resto.
•Motion Effects permette di creare incredibili effetti di parallasse come quelli che vedere nella home di iOS7 quando eseguite il tilt. In pratica potrete utilizzare alcuni valori forniti dall’accelerometro del telefono per creare interfacce che reagiscono ai movimenti fisici del telefono.
•UIDynamicAnimator è IL motore fisico di UIKit. Questa classe tiene traccia dei vari comportamenti che vengono aggiunti al motore, come la gravità, e fornisce il contesto complessivo. Quando create un’istanza di un animator, passate come parametro il riferimento ad una view che l’animator usa per definire il proprio sistema di coordinate.
•UIGravityBehavior modella il comportamento della gravità e esercita le forze su uno o più item, permettendo agli sviluppatori di modellare interazioni fisiche. Quando create un’istanza di questo comportamento, associate ad esso un insieme di item – tipicamente delle view. In questo modo voi potete selezionare quali item sono influenzati da questo comportamento.
magnitude = angolo e vettore forza di gravità
•UIDynamicAnimator è IL motore fisico di UIKit. Questa classe tiene traccia dei vari comportamenti che vengono aggiunti al motore, come la gravità, e fornisce il contesto complessivo. Quando create un’istanza di un animator, passate come parametro il riferimento ad una view che l’animator usa per definire il proprio sistema di coordinate.
•UIGravityBehavior modella il comportamento della gravità e esercita le forze su uno o più item, permettendo agli sviluppatori di modellare interazioni fisiche. Quando create un’istanza di questo comportamento, associate ad esso un insieme di item – tipicamente delle view. In questo modo voi potete selezionare quali item sono influenzati da questo comportamento.
magnitude = angolo e vettore forza di gravità
Il codice qui sopra crea un collision behavior (letteralmente un “comportamento delle collisioni”), che definisce uno o più confini con i quali interagisce l’oggetto associato al comportamento.
Invece che creare esplicitamente dei confini tramite coordinate, il codice sopra imposta a YES la proprietà translatesReferenceBoundsIntoBoundary. Questo permette al confine di usare i limiti (bounds) delle reference view utilizzata dal UIDynamicAnimator.
collision.translatesReferenceBoundsIntoBoundary = YES; //traduce la reference view dell'animator, come contenitore
Il codice qui sopra aggiunge un confine invisibile che coincide con il lato superiore della barriera. La barriera rossa rimane visibile all’utente ma non al motore dinamico, mentre il confine invisibile è ora visibile al motore e non all’utente. Nel momento in cui il quadrato cade, sembrerà collidere con la barriera anche se in realtà entrerà in contatto con il confine invisibile.
•elasticity – determina quanto elastica è una collisione vale a dire quanto rimbalza l’item durante una collisione.
•friction– è l’attrito e determina la quantità di resistenza al movimento quando l’oggetto striscia lungo una superficie.
•density – combinata con le dimensioni, restituisce la massa di un item. Più grande è la massa e più difficile sarà far accelerare o decelerare l’oggetto.
•resistance – determina la resistenza su movimenti lineari. È opposta alla “friction” che viene applicata solamente a movimenti di sliding.
•angularResistance – determina quanta resistenza offre un oggetto ad un movimento rotatorio.
•allowsRotation – questa proprietà è interessante perchè non modella nessuna proprietà fisica reale. Con questa proprietà impostata a NO l’oggetto non esegue alcuna rotazione, nonostante vengano applicate ad esso delle forze di rotazione.
GRAVITY
GRAVITY+COLLISION
GRAVITY+MULTIPLE COLLISION
DEMO APPLE se c’è tempo.