SlideShare ist ein Scribd-Unternehmen logo
1 von 58
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

•

Nuove API

•

XCode 5
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)

•

iOS7 impara quando effettuare
un fetch

•

Utile per app di news, social
networks, meteo, photo sharing
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
inutilizzate
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];
Background fetch - Step two
•

UIApplicationBackgroundFetchIntervalMi
nimum

•

NSTimerInterval
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
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
Background fetch - Debug
•

Simulare il background fetch

•

Abilitare l’opzione “Launch due to a
background fetch event” (nello schema
della app)
[DEMO]
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.
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
inutilizzate
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];
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
Silent notifications - Step three
•

Una push notification o silent notification,
è un JSON

•

Una silent notification è una push
notification con contenuto:
content-available : 1
Silent notifications - Step three
{

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

}

"aps" : {
"content-available": 1,
"sound": ""
}
}
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
Silent notifications - Step three
Quando una silent notification è quasi
conclusa:
• Incrementare

locali

• Richiamare

il badge/usare notifiche

il completionHandler
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.
[DEMO]
Background transfer service
•

Permette di trasferire grossi
file

•

Niente limite dei 10min come
in iOS6

•

iOS sveglia la app per gestire
i trasferimenti.
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.
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
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

•

NSURLSessionUploadTask:
NSData/File Stream => POST/PUT HTTP

•

NSURLSessionDownloadTask:
leggermente diversa dalle precedenti
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
NSURLSessionDownloadTask - Step
one
•

Definire NSURLSessionConfiguration
=> defaultSessionConfiguration

•

Definire NSURLSession

•

Definire NSURLSessionDownloadTask
(dall’istanza della session)

•

Implementare il protocollo (interfaccia)
desiderato
NSURLSessionDownloadTask Step two
•

I protocolli per le NSURLSession
implementano il protocollo
NSURLSessionDelegate

•

NSURLSessionDownloadDelegate è il
protocollo che utilizziamo

•

NSURLSessionDownloadDelegate ha tre
metodi @required (obbligatori)
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{}
[DEMO]
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
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)
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
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.
Background transfer service Step three
•

Nell’AppDelegate implementare la
property
@property (copy) void
(^backgroundSessionCompletionHandler)();

•

È l’handler delle
BackgroundURLSession, necessario per
richiamare l’NSURLSessionDelegate
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 conoscere
OpenGL

•

g = 9,8ms

•

dist_oggetto = 0.5 x g x tempo^2

2
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
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
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)
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)
UIKit Dynamics
UIDynamicAnimator *animator = [[UIDynamicAnimator
alloc] initWithReferenceView:self.view];
UIGravityBehavior *gravity = [[UIGravityBehavior alloc]
initWithItems:@[myUIView]];
[animator addBehavior:gravity];
UIKit Dynamics
•UICollisionBehavior

definisce uno o più
confini per la collisione

UICollisionBehavior *collision = [[UICollisionBehavior
alloc] initWithItems:@[self.theBomb]];
collision.translatesReferenceBoundsIntoBoundary =
YES;
[animator addBehavior:collision];
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];
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];
UIKit Dynamics
•UIDynamicBehavior

proprietà degli item

per configurare le

elasticity, friction, density, resistance,
angularResistance, allowsRotation
[DEMO]
Avanti il prossimo!

Tiziano Cacioppolini
WP8 Developer

Storage su WP8

Weitere ähnliche Inhalte

Andere mochten auch

0821 8614 8884, jenis jenis genteng rumah, www.jualgentengbeton
0821 8614 8884, jenis jenis genteng rumah, www.jualgentengbeton0821 8614 8884, jenis jenis genteng rumah, www.jualgentengbeton
0821 8614 8884, jenis jenis genteng rumah, www.jualgentengbetonGenteng Beton Pelita Mas
 
Messaggio di Sr. Alaide Deretti - 4 gennaio 2016
Messaggio di Sr. Alaide Deretti - 4 gennaio 2016Messaggio di Sr. Alaide Deretti - 4 gennaio 2016
Messaggio di Sr. Alaide Deretti - 4 gennaio 2016Maike Loes
 
Bamboo Products - www.nectar.org.in
Bamboo Products - www.nectar.org.inBamboo Products - www.nectar.org.in
Bamboo Products - www.nectar.org.inparasbuildtech2014
 
Stepstoapplyforpassportservices 130524024358-phpapp01
Stepstoapplyforpassportservices 130524024358-phpapp01Stepstoapplyforpassportservices 130524024358-phpapp01
Stepstoapplyforpassportservices 130524024358-phpapp01Drsumadhur Malhotra
 

Andere mochten auch (7)

0821 8614 8884, jenis jenis genteng rumah, www.jualgentengbeton
0821 8614 8884, jenis jenis genteng rumah, www.jualgentengbeton0821 8614 8884, jenis jenis genteng rumah, www.jualgentengbeton
0821 8614 8884, jenis jenis genteng rumah, www.jualgentengbeton
 
Messaggio di Sr. Alaide Deretti - 4 gennaio 2016
Messaggio di Sr. Alaide Deretti - 4 gennaio 2016Messaggio di Sr. Alaide Deretti - 4 gennaio 2016
Messaggio di Sr. Alaide Deretti - 4 gennaio 2016
 
Bamboo Products - www.nectar.org.in
Bamboo Products - www.nectar.org.inBamboo Products - www.nectar.org.in
Bamboo Products - www.nectar.org.in
 
Stepstoapplyforpassportservices 130524024358-phpapp01
Stepstoapplyforpassportservices 130524024358-phpapp01Stepstoapplyforpassportservices 130524024358-phpapp01
Stepstoapplyforpassportservices 130524024358-phpapp01
 
Distribuição
DistribuiçãoDistribuição
Distribuição
 
Unidad 5
Unidad 5Unidad 5
Unidad 5
 
Downloads
DownloadsDownloads
Downloads
 

Ähnlich wie iOS7 - multitasking e dynamics - Daniele Galiotto

Wearable Lab: Progettazione per Apple Watch
Wearable Lab: Progettazione per Apple WatchWearable Lab: Progettazione per Apple Watch
Wearable Lab: Progettazione per Apple WatchPaolo Musolino
 
Progettazione per Apple Watch - Todi Appy Days 2015
Progettazione per Apple Watch - Todi Appy Days 2015Progettazione per Apple Watch - Todi Appy Days 2015
Progettazione per Apple Watch - Todi Appy Days 2015Todi Appy Days
 
Xcode - Just do it
Xcode - Just do itXcode - Just do it
Xcode - Just do itpragmamark
 
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple WatchCodice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple WatchCodemotion
 
Sviluppare applicazioni geolocalizzate per iPhone
Sviluppare applicazioni geolocalizzate per iPhoneSviluppare applicazioni geolocalizzate per iPhone
Sviluppare applicazioni geolocalizzate per iPhoneEduard Roccatello
 
Bluetooth low energy & Lumia Sensor Core per Windows Phone 8.1
Bluetooth low energy & Lumia Sensor Core per Windows Phone 8.1Bluetooth low energy & Lumia Sensor Core per Windows Phone 8.1
Bluetooth low energy & Lumia Sensor Core per Windows Phone 8.1Massimo Bonanni
 
Cloud e iOS - Codemotion2013 Roma
Cloud e iOS - Codemotion2013 RomaCloud e iOS - Codemotion2013 Roma
Cloud e iOS - Codemotion2013 RomaFrancesco Novelli
 
Deep multitasking in Windows Phone Codename "Mango"
Deep multitasking in Windows Phone Codename "Mango"Deep multitasking in Windows Phone Codename "Mango"
Deep multitasking in Windows Phone Codename "Mango"Matteo Pagani
 
Linux Embedded per l'automazione
Linux Embedded per l'automazioneLinux Embedded per l'automazione
Linux Embedded per l'automazioneDaniele Costarella
 
Il PaaS di Google
Il PaaS di GoogleIl PaaS di Google
Il PaaS di GoogleMssiStf
 
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#DotNetCampus
 
Windows Phone 8.1 e i background tasks - Andrea Boschin - Codemotion Milan 2014
Windows Phone 8.1 e i background tasks - Andrea Boschin - Codemotion Milan 2014Windows Phone 8.1 e i background tasks - Andrea Boschin - Codemotion Milan 2014
Windows Phone 8.1 e i background tasks - Andrea Boschin - Codemotion Milan 2014Codemotion
 
Slide Mulesoft Meetup Milano #10.pdf
Slide Mulesoft Meetup Milano #10.pdfSlide Mulesoft Meetup Milano #10.pdf
Slide Mulesoft Meetup Milano #10.pdfFlorence Consulting
 
Cloud Google App Engine Paas
Cloud   Google App Engine PaasCloud   Google App Engine Paas
Cloud Google App Engine Paassteccami
 
Nord-Est Italy Seminars 2012
Nord-Est Italy Seminars 2012Nord-Est Italy Seminars 2012
Nord-Est Italy Seminars 2012alexzio
 

Ähnlich wie iOS7 - multitasking e dynamics - Daniele Galiotto (20)

Google AppEngine
Google AppEngineGoogle AppEngine
Google AppEngine
 
Wearable Lab: Progettazione per Apple Watch
Wearable Lab: Progettazione per Apple WatchWearable Lab: Progettazione per Apple Watch
Wearable Lab: Progettazione per Apple Watch
 
Progettazione per Apple Watch - Todi Appy Days 2015
Progettazione per Apple Watch - Todi Appy Days 2015Progettazione per Apple Watch - Todi Appy Days 2015
Progettazione per Apple Watch - Todi Appy Days 2015
 
Xcode - Just do it
Xcode - Just do itXcode - Just do it
Xcode - Just do it
 
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple WatchCodice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
 
Sviluppare applicazioni geolocalizzate per iPhone
Sviluppare applicazioni geolocalizzate per iPhoneSviluppare applicazioni geolocalizzate per iPhone
Sviluppare applicazioni geolocalizzate per iPhone
 
Bluetooth low energy & Lumia Sensor Core per Windows Phone 8.1
Bluetooth low energy & Lumia Sensor Core per Windows Phone 8.1Bluetooth low energy & Lumia Sensor Core per Windows Phone 8.1
Bluetooth low energy & Lumia Sensor Core per Windows Phone 8.1
 
Infrastructure as Data
Infrastructure as DataInfrastructure as Data
Infrastructure as Data
 
Cloud e iOS - Codemotion2013 Roma
Cloud e iOS - Codemotion2013 RomaCloud e iOS - Codemotion2013 Roma
Cloud e iOS - Codemotion2013 Roma
 
Deep multitasking in Windows Phone Codename "Mango"
Deep multitasking in Windows Phone Codename "Mango"Deep multitasking in Windows Phone Codename "Mango"
Deep multitasking in Windows Phone Codename "Mango"
 
XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13
 
Linux Embedded per l'automazione
Linux Embedded per l'automazioneLinux Embedded per l'automazione
Linux Embedded per l'automazione
 
Il PaaS di Google
Il PaaS di GoogleIl PaaS di Google
Il PaaS di Google
 
Fmdp Total System Monitor
Fmdp Total System MonitorFmdp Total System Monitor
Fmdp Total System Monitor
 
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
 
Windows Phone 8.1 e i background tasks - Andrea Boschin - Codemotion Milan 2014
Windows Phone 8.1 e i background tasks - Andrea Boschin - Codemotion Milan 2014Windows Phone 8.1 e i background tasks - Andrea Boschin - Codemotion Milan 2014
Windows Phone 8.1 e i background tasks - Andrea Boschin - Codemotion Milan 2014
 
Slide Mulesoft Meetup Milano #10.pdf
Slide Mulesoft Meetup Milano #10.pdfSlide Mulesoft Meetup Milano #10.pdf
Slide Mulesoft Meetup Milano #10.pdf
 
Cloud Google App Engine Paas
Cloud   Google App Engine PaasCloud   Google App Engine Paas
Cloud Google App Engine Paas
 
Nord-Est Italy Seminars 2012
Nord-Est Italy Seminars 2012Nord-Est Italy Seminars 2012
Nord-Est Italy Seminars 2012
 
Xamarin.android
Xamarin.androidXamarin.android
Xamarin.android
 

iOS7 - multitasking e dynamics - Daniele Galiotto

  • 1.
  • 2. Daniele Galiotto Freelance iOS Developer www.g8production.com
  • 3. Multitasking & dynamic: le novità di iOS7 per il multitasking e l'interazione tra le view iOS7 Multitasking Dynamics
  • 4. iOS7 • 64 Bit support • Sprite Kit• Multitasking • AirDrop • Peer-to-Peer • BLE • Dynamic • Nuova grafica • Nuove API • XCode 5
  • 6. Fino a ieri • Background task completion • Background audio • Location services • VoIP • Newsstand
  • 7. iOS7 - Multitasking • Background fetch • Silent notifications • Background transfer service
  • 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];
  • 12. Background fetch - Step two • UIApplicationBackgroundFetchIntervalMi nimum • NSTimerInterval
  • 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
  • 23. Silent notifications - Step three { { "aps" : { "alert" : "YAP", "badge" : 2, "sound" : "sound.aiff" } } "aps" : { "content-available": 1, "sound": "" } }
  • 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)
  • 36. 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{}
  • 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
  • 43. Background transfer service Step four • Avvisare l’utente con un badge o con una local notification
  • 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)
  • 51. UIKit Dynamics UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[myUIView]]; [animator addBehavior:gravity];
  • 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];
  • 54. 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];
  • 55. UIKit Dynamics •UIDynamicBehavior proprietà degli item per configurare le elasticity, friction, density, resistance, angularResistance, allowsRotation
  • 57.
  • 58. Avanti il prossimo! Tiziano Cacioppolini WP8 Developer Storage su WP8

Hinweis der Redaktion

  1. 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.
  2. Abilitare Background fetch in XCode 5 (project/capabilities) Questo aggiunge nel plist il background mode fetch.
  3. 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];
  4. 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).
  5. 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
  6. Se una richiesta, completionHandler incluso, dura più di 30 secondi, l’app torna in sleep, sospesa, senza aggiornamento.
  7. 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).
  8. Nessuno avrà mai bisogno di una memoria maggiore di 640Kb su un pc. Bill Gates 1981 Moriremo tutti. Maya
  9. 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.
  10. Abilitare Remote notifications in XCode 5 (project/capabilities) Questo aggiunge nel plist il remote-notification mode.
  11. 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.
  12. 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
  13. Se una richiesta, completionHandler incluso, dura più di 30 secondi, l’app torna in sleep, sospesa, senza aggiornamento.
  14. 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
  15. 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": ""}
  16. Trasferimenti e ciò che ne comporta come autenticazioni, errori, completamenti.
  17. NSURLSession è migliore di NSURLConnection. Aiuta il trasferimento di grossi file.
  18. 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.
  19. 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.
  20. 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.
  21. 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.
  22. 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.
  23. Download, Pause, Resume. defaultSessionConfiguration
  24. 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.
  25. 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)
  26. Metodo chiamato quando tutti i trasferimenti di background, associati ad una NSURLSession, sono completati o falliti
  27. Proprietà gestita dal metodo (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session della diapositiva precedente
  28. Metodo chiamato quando tutti i trasferimenti di background, associati ad una NSURLSession, sono completati o falliti
  29. Download BTS, app in background, completamento download, riapro app e c’è l’immagine;
  30. forza gravità g distanza oggetto dist oggetto
  31. •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.
  32. •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.
  33. •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à
  34. •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à
  35. 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
  36. 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.
  37. •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.
  38. GRAVITY GRAVITY+COLLISION GRAVITY+MULTIPLE COLLISION DEMO APPLE se c’è tempo.