Daniele Galiotto
Freelance iOS Developer
www.g8production.com
Multitasking & dynamic: le
novità di iOS7 per il multitasking
e l'interazione tra le view

iOS7
Multitasking
Dynamics
iOS7

•

64 Bit support

•

Sprite Kit• Multitasking

•

AirDrop

•

Peer-to-Peer

•

BLE

•

Dynamic

•

Nuova grafica

•...
Multitasking
Fino a ieri
•

Background task completion

•

Background audio

•

Location services

•

VoIP

•

Newsstand
iOS7 - Multitasking
•

Background fetch

•

Silent notifications

•

Background transfer service
Background fetch
•

Basta attese di download nuovi
dati (o quasi)

•

Download nuovi dati in
background (UP -> DL -> BG)

...
Background fetch - Step one
•

Abilitare background fetch (direttamente
da XCode 5, Progetto/Capabilities)
Background fetch - Step one
•

E’ importante abilitare solo ciò che serve,

•

Apple non accetta app con opzioni
inutilizz...
Background fetch - Step two
•

Impostare l’intervallo di fetch
nell’AppDelegate in

- (BOOL)application:(UIApplication *)a...
Background fetch - Step two
•

UIApplicationBackgroundFetchIntervalMi
nimum

•

NSTimerInterval
Background fetch - Step three
•

Implementare nell’AppDelegate il metodo

application:performFetchWithCompletionHandler:
•...
Background fetch - Step three
•

Una richiesta fetch non può durare più di 30
secondi fino al completionHandler altrimenti...
Background fetch - Debug
•

Simulare il background fetch

•

Abilitare l’opzione “Launch due to a
background fetch event” ...
[DEMO]
Silent notifications
•

Sono notifiche… silenziose!

•

Permettono di avviare un
download di un nuovo contenuto
non troppo...
Silent notifications - Step one
•

Abilitare remote notifications
(direttamente da XCode 5,
Progetto/Capabilities)
Silent notifications - Step one
•

E’ importante abilitare solo ciò che serve,

•

Apple non accetta app con opzioni
inuti...
Silent notifications - Step two
•

Come per le push notification, vanno
registrate le notifiche nell’AppDelegate in
- (BOO...
Silent notifications - Step two
•

Implementare nell’AppDelegate il metodo
application:didReceiveRemoteNotification:fetchC...
Silent notifications - Step three
•

Una push notification o silent notification,
è un JSON

•

Una silent notification è ...
Silent notifications - Step three
{

{
"aps" : {
"alert" : "YAP",
"badge" : 2,
"sound" : "sound.aiff"
}

}

"aps" : {
"con...
Silent notifications - Step three
•

Una richiesta fetch non può durare più di 30
secondi fino al completionHandler altrim...
Silent notifications - Step three
Quando una silent notification è quasi
conclusa:
• Incrementare

locali

• Richiamare

i...
Silent notifications - Debug
•

Inviare una silent notification tramite
servizi tipo Parse.
Ovviamente prima si devono con...
[DEMO]
Background transfer service
•

Permette di trasferire grossi
file

•

Niente limite dei 10min come
in iOS6

•

iOS sveglia...
Background transfer service
•

I trasferimenti continuano anche se viene
messa la app in background

•

La app include una...
NSURLSession - benefits
•

Upload e download su thread in
background

•

Possibilità di mettere in pausa, stoppare e
far r...
NSURLSession - Step one
•

NSURLSessionTask è la classe base
per i task nella session
NSURLSession
•

NSURLSessionTask è la classe base per i
task nella session

•

NSURLSessionDataTask:
GET HTTP => NSData

•...
NSURLSessionDownloadTask
•

Task che lavora direttamente su file temp

•

Durante il download viene aggiornato lo
stato de...
NSURLSessionDownloadTask - Step
one
•

Definire NSURLSessionConfiguration
=> defaultSessionConfiguration

•

Definire NSUR...
NSURLSessionDownloadTask Step two
•

I protocolli per le NSURLSession
implementano il protocollo
NSURLSessionDelegate

•

...
NSURLSessionDownloadTask Step two
- (void)URLSession:(NSURLSession *)session downloadTask:
(NSURLSessionDownloadTask *)dow...
[DEMO]
Background transfer service - Step
one (come prima)
•

Definire NSURLSessionConfiguration
=> backgroundSessionConfiguratio...
Background transfer service Step two (come prima)
•

I protocolli per le NSURLSession
implementano il protocollo
NSURLSess...
Background transfer service Step three
•

Implementare il metodo

(void)URLSessionDidFinishEventsForBackgroundURLSessi
on:...
Background transfer service Step three
•

Nell’AppDelegate implementare il metodo
-(void)application:(UIApplication *)appl...
Background transfer service Step three
•

Nell’AppDelegate implementare la
property
@property (copy) void
(^backgroundSess...
Background transfer service Step four
•

Avvisare l’utente con un badge o con una
local notification
[DEMO]
Dynamics
iOS7 - Dynamic
•

Apple incoraggia la costruzione di
UI che permettano di percepire la
realtà

•

Non è necessario conosce...
Dynamic - Nuovi tools
•

UIKit Dynamics: motore fisico
integrato in UIKit. Gestisce
gravità, elasticità e forze.

•

Motio...
UIKit Dynamics
•

UIDynamicAnimator è il motore fisico di
UIKit, tiene traccia dei comportamenti
aggiunti al motore

•

Co...
UIKit Dynamics
•

La formula per la distanza degli oggetti
resta la stessa dist_oggetto = 0.5 x g x
tempo^2

•

Però, anzi...
UIKit Dynamics
•

UIGravityBehavior modella il comportamento
della gravità su uno o più item

•

Ad esso è associato un in...
UIKit Dynamics
UIDynamicAnimator *animator = [[UIDynamicAnimator
alloc] initWithReferenceView:self.view];
UIGravityBehavio...
UIKit Dynamics
•UICollisionBehavior

definisce uno o più
confini per la collisione

UICollisionBehavior *collision = [[UIC...
UIKit Dynamics
•UICollisionBehavior

definisce uno o più
confini per la collisione

UICollisionBehavior *collision = [[UIC...
UIKit Dynamics
CGPoint rightEdge =
CGPointMake(self.theWall.frame.origin.x +
self.theWall.frame.size.width,
self.theWall.f...
UIKit Dynamics
•UIDynamicBehavior

proprietà degli item

per configurare le

elasticity, friction, density, resistance,
an...
[DEMO]
Avanti il prossimo!

Tiziano Cacioppolini
WP8 Developer

Storage su WP8
iOS7 - multitasking e dynamics - Daniele Galiotto
iOS7 - multitasking e dynamics - Daniele Galiotto
Upcoming SlideShare
Loading in …5
×

iOS7 - multitasking e dynamics - Daniele Galiotto

655 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
655
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • 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.
  • Download, Pause, Resume. defaultSessionConfiguration
  • 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.
  • iOS7 - multitasking e dynamics - Daniele Galiotto

    1. 1. Daniele Galiotto Freelance iOS Developer www.g8production.com
    2. 2. Multitasking & dynamic: le novità di iOS7 per il multitasking e l'interazione tra le view iOS7 Multitasking Dynamics
    3. 3. iOS7 • 64 Bit support • Sprite Kit• Multitasking • AirDrop • Peer-to-Peer • BLE • Dynamic • Nuova grafica • Nuove API • XCode 5
    4. 4. Multitasking
    5. 5. Fino a ieri • Background task completion • Background audio • Location services • VoIP • Newsstand
    6. 6. iOS7 - Multitasking • Background fetch • Silent notifications • Background transfer service
    7. 7. 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
    8. 8. Background fetch - Step one • Abilitare background fetch (direttamente da XCode 5, Progetto/Capabilities)
    9. 9. Background fetch - Step one • E’ importante abilitare solo ciò che serve, • Apple non accetta app con opzioni inutilizzate
    10. 10. 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];
    11. 11. Background fetch - Step two • UIApplicationBackgroundFetchIntervalMi nimum • NSTimerInterval
    12. 12. 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
    13. 13. 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
    14. 14. Background fetch - Debug • Simulare il background fetch • Abilitare l’opzione “Launch due to a background fetch event” (nello schema della app)
    15. 15. [DEMO]
    16. 16. 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.
    17. 17. Silent notifications - Step one • Abilitare remote notifications (direttamente da XCode 5, Progetto/Capabilities)
    18. 18. Silent notifications - Step one • E’ importante abilitare solo ciò che serve, • Apple non accetta app con opzioni inutilizzate
    19. 19. 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];
    20. 20. 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
    21. 21. Silent notifications - Step three • Una push notification o silent notification, è un JSON • Una silent notification è una push notification con contenuto: content-available : 1
    22. 22. Silent notifications - Step three { { "aps" : { "alert" : "YAP", "badge" : 2, "sound" : "sound.aiff" } } "aps" : { "content-available": 1, "sound": "" } }
    23. 23. 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
    24. 24. Silent notifications - Step three Quando una silent notification è quasi conclusa: • Incrementare locali • Richiamare il badge/usare notifiche il completionHandler
    25. 25. 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.
    26. 26. [DEMO]
    27. 27. Background transfer service • Permette di trasferire grossi file • Niente limite dei 10min come in iOS6 • iOS sveglia la app per gestire i trasferimenti.
    28. 28. 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.
    29. 29. 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
    30. 30. NSURLSession - Step one • NSURLSessionTask è la classe base per i task nella session
    31. 31. 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
    32. 32. 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
    33. 33. NSURLSessionDownloadTask - Step one • Definire NSURLSessionConfiguration => defaultSessionConfiguration • Definire NSURLSession • Definire NSURLSessionDownloadTask (dall’istanza della session) • Implementare il protocollo (interfaccia) desiderato
    34. 34. NSURLSessionDownloadTask Step two • I protocolli per le NSURLSession implementano il protocollo NSURLSessionDelegate • NSURLSessionDownloadDelegate è il protocollo che utilizziamo • NSURLSessionDownloadDelegate ha tre metodi @required (obbligatori)
    35. 35. NSURLSessionDownloadTask Step two - (void)URLSession:(NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {} -(void)URLSession:(NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didWriteData: (int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{} - (void)URLSession:(NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didResumeAtOffset: (int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{}
    36. 36. [DEMO]
    37. 37. 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
    38. 38. 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)
    39. 39. 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
    40. 40. 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.
    41. 41. Background transfer service Step three • Nell’AppDelegate implementare la property @property (copy) void (^backgroundSessionCompletionHandler)(); • È l’handler delle BackgroundURLSession, necessario per richiamare l’NSURLSessionDelegate
    42. 42. Background transfer service Step four • Avvisare l’utente con un badge o con una local notification
    43. 43. [DEMO]
    44. 44. Dynamics
    45. 45. 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
    46. 46. 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
    47. 47. 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
    48. 48. 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)
    49. 49. 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)
    50. 50. UIKit Dynamics UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[myUIView]]; [animator addBehavior:gravity];
    51. 51. UIKit Dynamics •UICollisionBehavior definisce uno o più confini per la collisione UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.theBomb]]; collision.translatesReferenceBoundsIntoBoundary = YES; [animator addBehavior:collision];
    52. 52. 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];
    53. 53. UIKit Dynamics CGPoint rightEdge = CGPointMake(self.theWall.frame.origin.x + self.theWall.frame.size.width, self.theWall.frame.origin.y); [collision addBoundaryWithIdentifier:@"wall" fromPoint:self.theWall.frame.origin toPoint:rightEdge];
    54. 54. UIKit Dynamics •UIDynamicBehavior proprietà degli item per configurare le elasticity, friction, density, resistance, angularResistance, allowsRotation
    55. 55. [DEMO]
    56. 56. Avanti il prossimo! Tiziano Cacioppolini WP8 Developer Storage su WP8

    ×