ios7 - multitasking e dynamics - daniele galiotto

58

Upload: mokapp

Post on 21-May-2015

403 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: iOS7 - multitasking e dynamics - Daniele Galiotto
Page 2: iOS7 - multitasking e dynamics - Daniele Galiotto

Daniele Galiotto

Freelance iOS

Developerwww.g8production.com

Page 3: iOS7 - multitasking e dynamics - Daniele Galiotto

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

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

Multitasking

Page 6: iOS7 - multitasking e dynamics - Daniele Galiotto

Fino a ieri• Background task

completion

• Background audio

• Location services

• VoIP

• Newsstand

Page 7: iOS7 - multitasking e dynamics - Daniele Galiotto

iOS7 - Multitasking

• Background fetch

• Silent notifications

• Background transfer service

Page 8: iOS7 - multitasking e dynamics - Daniele Galiotto

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

Background fetch - Step one

• Abilitare background fetch (direttamente da XCode 5, Progetto/Capabilities)

Page 10: iOS7 - multitasking e dynamics - Daniele Galiotto

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

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

Background fetch - Step two

• UIApplicationBackgroundFetchIntervalMinimum

• NSTimerInterval

Page 13: iOS7 - multitasking e dynamics - Daniele Galiotto

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

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

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

[DEMO]

Page 17: iOS7 - multitasking e dynamics - Daniele Galiotto

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

Silent notifications - Step one

• Abilitare remote notifications (direttamente da XCode 5, Progetto/Capabilities)

Page 19: iOS7 - multitasking e dynamics - Daniele Galiotto

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

• 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

• 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

• 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

{ "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

• 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

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

• 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

[DEMO]

Page 28: iOS7 - multitasking e dynamics - Daniele Galiotto

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

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

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

NSURLSession - Step one

• NSURLSessionTask è la classe base per i task nella session

Page 32: iOS7 - multitasking e dynamics - Daniele Galiotto

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

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

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

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

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

[DEMO]

Page 38: iOS7 - multitasking e dynamics - Daniele Galiotto

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

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

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

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

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

Background transfer service - Step four

• Avvisare l’utente con un badge o con una local notification

Page 44: iOS7 - multitasking e dynamics - Daniele Galiotto

[DEMO]

Page 45: iOS7 - multitasking e dynamics - Daniele Galiotto

Dynamics

Page 46: iOS7 - multitasking e dynamics - Daniele Galiotto

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

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

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

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

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

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

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

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

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

UIKit Dynamics

•UIDynamicBehavior per configurare le proprietà degli item

elasticity, friction, density, resistance, angularResistance, allowsRotation

Page 56: iOS7 - multitasking e dynamics - Daniele Galiotto

[DEMO]

Page 57: iOS7 - multitasking e dynamics - Daniele Galiotto
Page 58: iOS7 - multitasking e dynamics - Daniele Galiotto

Avanti il prossimo!

Tiziano Cacioppolini

WP8 Developer

Storage su WP8