iOS7 - multitasking e dynamics - Daniele Galiotto
Transcript of iOS7 - multitasking e dynamics - Daniele Galiotto
![Page 1: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/1.jpg)
![Page 3: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/3.jpg)
Multitasking & dynamic: le novità di iOS7 per il
multitasking e l'interazione tra le view
iOS7Multitaskin
gDynamics
![Page 4: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/4.jpg)
iOS7
• Nuova grafica
• Nuove API
• XCode 5
• 64 Bit support
• Sprite Kit
• AirDrop
• Peer-to-Peer
• BLE
• Multitasking
• Dynamic
![Page 5: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/5.jpg)
Multitasking
![Page 6: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/6.jpg)
Fino a ieri• Background task
completion
• Background audio
• Location services
• VoIP
• Newsstand
![Page 7: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/7.jpg)
iOS7 - Multitasking
• Background fetch
• Silent notifications
• Background transfer service
![Page 8: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/8.jpg)
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
![Page 9: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/9.jpg)
Background fetch - Step one
• Abilitare background fetch (direttamente da XCode 5, Progetto/Capabilities)
![Page 10: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/10.jpg)
Background fetch - Step one
• E’ importante abilitare solo ciò che serve,
• Apple non accetta app con opzioni inutilizzate
![Page 11: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/11.jpg)
Background fetch - Step two
• Impostare l’intervallo di fetch nell’AppDelegate in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
• Di default è UIApplicationBackgroundFetchIntervalNever
• [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
![Page 12: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/12.jpg)
Background fetch - Step two
• UIApplicationBackgroundFetchIntervalMinimum
• NSTimerInterval
![Page 13: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/13.jpg)
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
![Page 14: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/14.jpg)
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
![Page 15: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/15.jpg)
Background fetch - Debug
• Simulare il background fetch
• Abilitare l’opzione “Launch due to a background fetch event” (nello schema della app)
![Page 16: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/16.jpg)
[DEMO]
![Page 17: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/17.jpg)
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.
![Page 18: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/18.jpg)
Silent notifications - Step one
• Abilitare remote notifications (direttamente da XCode 5, Progetto/Capabilities)
![Page 19: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/19.jpg)
Silent notifications - Step one
• E’ importante abilitare solo ciò che serve,
• Apple non accetta app con opzioni inutilizzate
![Page 20: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/20.jpg)
• Come per le push notification, vanno registrate le notifiche nell’AppDelegate in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
• [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
Silent notifications - Step two
![Page 21: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/21.jpg)
• Implementare nell’AppDelegate il metodo application:didReceiveRemoteNotification:fetchCompletionHandler:
• UIBackgroundFetchResultNewData: se ci sono
nuovi dati, ricordarsi di aggiornare la UI
• UIBackgroundFetchResultNoData: se non ci sono nuovi dati
• UIBackgroundFetchResultFailed: se si è avuto un errore
Silent notifications - Step two
![Page 22: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/22.jpg)
• Una push notification o silent notification, è un JSON
• Una silent notification è una push notification con contenuto:
content-available : 1
Silent notifications - Step three
![Page 23: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/23.jpg)
{ "aps" : { "alert" : "YAP", "badge" : 2, "sound" : "sound.aiff" }}
{ "aps" : {
"content-available": 1, "sound": ""
}}
Silent notifications - Step three
![Page 24: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/24.jpg)
• 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
Silent notifications - Step three
![Page 25: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/25.jpg)
Quando una silent notification è quasi conclusa:
•Incrementare il badge/usare notifiche locali
•Richiamare il completionHandler
Silent notifications - Step three
![Page 26: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/26.jpg)
• Inviare una silent notification tramite servizi tipo Parse.
Ovviamente prima si devono configurare Parse e la app per poter attivare le push notification.
Silent notifications - Debug
![Page 27: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/27.jpg)
[DEMO]
![Page 28: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/28.jpg)
Background transfer service
• Permette di trasferire grossi file
• Niente limite dei 10min come in iOS6
• iOS sveglia la app per gestire i trasferimenti.
![Page 29: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/29.jpg)
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.
![Page 30: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/30.jpg)
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
![Page 31: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/31.jpg)
NSURLSession - Step one
• NSURLSessionTask è la classe base per i task nella session
![Page 32: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/32.jpg)
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
![Page 33: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/33.jpg)
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
![Page 34: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/34.jpg)
NSURLSessionDownloadTask - Step one
• Definire NSURLSessionConfiguration
=> defaultSessionConfiguration
• Definire NSURLSession
• Definire NSURLSessionDownloadTask (dall’istanza della session)
• Implementare il protocollo (interfaccia) desiderato
![Page 35: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/35.jpg)
NSURLSessionDownloadTask - Step two
• I protocolli per le NSURLSession implementano il protocollo NSURLSessionDelegate
• NSURLSessionDownloadDelegate è il protocollo che utilizziamo
• NSURLSessionDownloadDelegate ha tre metodi @required (obbligatori)
![Page 36: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/36.jpg)
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{}
![Page 37: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/37.jpg)
[DEMO]
![Page 38: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/38.jpg)
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
![Page 39: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/39.jpg)
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)
![Page 40: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/40.jpg)
Background transfer service - Step three
• Implementare il metodo(void)URLSessionDidFinishEventsForBackgroundURLSession:(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
![Page 41: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/41.jpg)
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.
![Page 42: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/42.jpg)
Background transfer service - Step three
• Nell’AppDelegate implementare la property@property (copy) void (^backgroundSessionCompletionHandler)();
• È l’handler delle BackgroundURLSession, necessario per richiamare l’NSURLSessionDelegate
![Page 43: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/43.jpg)
Background transfer service - Step four
• Avvisare l’utente con un badge o con una local notification
![Page 44: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/44.jpg)
[DEMO]
![Page 45: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/45.jpg)
Dynamics
![Page 46: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/46.jpg)
iOS7 - Dynamic• Apple incoraggia la costruzione
di UI che permettano di percepire la realtà
• Non è necessario conoscere OpenGL
• g = 9,8ms2
• dist_oggetto = 0.5 x g x tempo^2
![Page 47: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/47.jpg)
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
![Page 48: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/48.jpg)
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
![Page 49: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/49.jpg)
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)
![Page 50: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/50.jpg)
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)
![Page 51: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/51.jpg)
UIKit Dynamics
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[myUIView]];
[animator addBehavior:gravity];
![Page 52: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/52.jpg)
UIKit Dynamics•UICollisionBehavior definisce uno o più confini per la collisione
UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.theBomb]];
collision.translatesReferenceBoundsIntoBoundary = YES;
[animator addBehavior:collision];
![Page 53: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/53.jpg)
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];
![Page 54: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/54.jpg)
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];
![Page 55: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/55.jpg)
UIKit Dynamics
•UIDynamicBehavior per configurare le proprietà degli item
elasticity, friction, density, resistance, angularResistance, allowsRotation
![Page 56: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/56.jpg)
[DEMO]
![Page 57: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/57.jpg)
![Page 58: iOS7 - multitasking e dynamics - Daniele Galiotto](https://reader036.fdocument.pub/reader036/viewer/2022062704/555dd989d8b42a192c8b46fd/html5/thumbnails/58.jpg)
Avanti il prossimo!
Tiziano Cacioppolini
WP8 Developer
Storage su WP8