Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

iOS7 - multitasking e dynamics - Daniele Galiotto

677 views

Published on

  • Be the first to comment

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

×