際際滷

際際滷Share a Scribd company logo
WEARABLE LAB:
PROGETTAZIONE
PER APPLE WATCH
Paolo Musolino
Erik Peruzzi
26 Settembre 2015
Erik Peruzzi
iOS Software Engineer
Of鍖cina 31
Twitter: @ErikPeruzzi
email: erik.peruzzi@gmail.com
Paolo Musolino
iOS Software Engineer
IQUII srl
Twitter: @pmusolino
email: pmusolino@gmail.com
One more thing
Force touch
Bluetooth 4.0 low energy
TAPTIC Engine
Digital Crown e molto
altro.
42mm
38mm
Identico aspect ratio
Oltre 10000 app gi
disponibili
Fonte: Apple Keynote 9 Settembre 2015
App fornite da Apple:
 Possono funzionare senza iPhone
 Hanno accesso ai dati dei sensori
 Possibilit di animazioni avanzate
App terze parti:
 Girano interamente su iPhone
 Vengono installate quando la corrispettiva
app viene installata su iPhone
 SDK (Watch Kit) limitato
 Con Watch Kit 2 cambiano le regole del gioco
Non 竪 (ancora) possibile
 Utilizzare le app senza un iPhone connesso
 Realizzare app che girano solo su Apple Watch
 Creare animazioni avanzate
 Utilizzare i dati dei sensori biometrici e di movimento
 Accedere ai dati dellapp (parente) che gira
su iPhone
 Creare animazioni basate sulle immagini
 Ricevere noti鍖che e visualizzarle
 Presentare delle viste e creare interfacce
semplici
Ma si pu嘆
SwiftObj-C
WatchKit App + WatchKit Extension
WatchKit Extension
 Gira su iPhone
 Ha il suo ciclo di vita (willActivate, didActivate, etc)
 Cattura le interazioni dellutente dallapp installata su Apple Watch
 Aggiorna linterfaccia del watch da remoto
 Esegue piccoli e brevi task
 Accede ai dati condivisi con la WatchKit App
WatchKit App
 Contiene risorse statiche
 Contiene linterfaccia gra鍖ca (Storyboard
necessario)
 Non esegue codice
iPhone App
 E lapp parente di quella
presente su Apple Watch
 Pu嘆 processare task
molto lunghi
 Pu嘆 accedere ai dati
condivisi con Apple
Watch
 Esegue processi che
sono separati da quelli
dellestensione.
WatchKit come UIKit
WatchKit UIKit
WKInterfaceController UIViewController
WKUserNotificationInterfaceController UIApplicationDelegate + UIAlertController
WKInterfaceDevice UIDevice
WKInterfaceObject UIView
WKInterfaceButton UIButton
WKInterfaceDate UILabel + NSDateFormatter
WKInterfaceGroup UIScrollView
WKInterfaceImage UIImageView
WKInterfaceLabel UILabel
WKInterfaceMap MKMapView
WKInterfaceSeparator UITableView.separatorColor / .separatorStyle
WKInterface際際滷r UIStepper + UI際際滷r
WKInterfaceSwitch UISwitch
WKInterfaceTable UITableView
WKInterfaceTimer UILabel + NSDateFormatter + NSTimer
WKInterfaceController
 Tutti i controller di WatchKit sono sottoclassi
di WKInterfaceController
 E molto simile a UIViewController, ma con
un lifecycle differente.
 Al suo interno possono essere inseriti molti
dei componenti di WatchKit per realizzare
interfacce complesse.
WKInterfaceController gestisce gli elementi in una scena.
UIViewController gestisce View e Subview.
Gli oggetti dellinterfaccia non sono View, ma si comportano in
modo simile.
Inizializzazione usando initWithContext:
override init(context: AnyObject?) {
super.init(context: context)
// ...
}
// MARK: - WKInterfaceController
override func willActivate() {
// ...
}
override func didDeactivate() {
// ...
}
Solo 2 metodi per il Lyfecycle:
That's it: 2 methods. No loading /
unloading, no will / did appear /
disappear, no animated:YES. Watch
apps are simple by necessity.
Communication between the iOS device
driving the application and the watch is
both time-consuming and battery-
consuming, so all of the setup for the
interface controller's scene is to be
done in the initializer and willActivate.
Both during and after didDeactivate, the
Watch will ignore attempts to update
the state of interface elements.
Stack di navigazione
Le applicazioni hanno una navigazione Gerarchica o
Page-Based.
The presentControllerWithName:context: method performs a page-based navigation
equivalent to using the modal segue. The context argument allows you to pass data
to the destination Interface Controller.
//Hierarchical Navigation
@IBAction func btnHierarchical() {
pushControllerWithName(Page2,
context: [segue: hierarchical,
data:Passed through hierarchical navigation])
}
//Page Based Navigation
@IBAction func btnPagebased() {
presentControllerWithName(Page2,
context: [segue: pagebased,
data: Passed through page-based navigation])
}
Page2 竪 lidenti鍖cativo del successivo InterfaceController. The
pushControllerWithName:context: method performs a hierarchical navigation
equivalent to using the push segue. The context argument allows you to pass data
to the destination Interface Controller. You navigate to the speci鍖c Interface
Controller you want by using its identi鍖er.
Progetto Xcode: come appare
Targets: iOS, Tests, WatchKit Extension
Page3.swift
import WatchKit
import Foundation
class Page3: WKInterfaceController {
override init(context: AnyObject?)
{
super.init(context: context)
}
override func willActivate() {
super.willActivate()
}
override func didDeactivate() {
super.didDeactivate()
}
}
Aggiungiamo un Interface Controller
per Page 3 allo Storyboard
IC iniziale IC con navigazione
gerarchica
IC con navigazione
page-based
Settiamo gli attributi 稼艶鉛鉛i稼壊沿艶界岳看姻
Con鍖guriamo i pulsanti
@IBAction func btnPagebased() {
presentControllerWithNames(
[Page2, Page3],
contexts: [
[segue: pagebased,
data: Passed through page-based navigation],
[segue: pagebased,
data: Passed through page-based navigation]])
}
Stiamo chiamando presentControllerWithNames:contexts: con
i seguenti argomenti:
 Un array di stringhe contenenti gli identi鍖cativi degli Interface
Controllers da visualizzare.
 Un array di oggetti da passare allInterface Controller di
destinazione. Il primo oggetto sar passato a Page2, il
secondo oggetto a Page3.
RUN
Page-Based Button -> Page 2 -> Left Swipe -> Page 3
WKInterfaceObject
E come una UIView, con propriet come alpha, hidden,
allineamento orizzontale e verticale, width, height.
Object Action Method
Button - (IBAction)doButtonAction
Switch - (IBAction)doSwitchMethod:(BOOL)on
際際滷r - (IBAction)do際際滷rAction:(float)value
Table
- (IBAction)doTableRowTapAction:
(NSInteger)rowIndex
Menu Item - (IBAction)doMenuItemAction
The most striking di鍖erence is the lack
of a frame. Instead of manually
specifying coordinate points or setting
up Auto Layout constraints, WatchKit
interface objects are laid out in a grid
according to their margins and
respective ordering, which is
reminiscent to working with a CSS
framework like Bootstrap (or for you
Rubyists out there, remember Shoes?).
Oggetti principali con cui
costruire app complesse
 WKInterfaceButton
 WKInterfaceTable
 WKInterfaceLabel
 WKInterfaceDate & WKInterfaceTimer
 WKInterface際際滷r & WKInterfaceSwitch
WKInterfaceDate is a special kind of
label that displays the current date or
time. WKInterfaceTimer is similar,
except that it displays a countdown
until a speci鍖ed date.
Share Data
3 Metodi per comunicare con la main
app e scambiarsi informazioni
 Metodo 1: OpenParentApp
 Metodo 2: Share Data
Cache con NSUserDefaults
e App Groups
 Metodo 3: Update Callbacks
usando il Darwin Noti鍖cation
Center
Metodo 1
openParentApplication:reply:
1) Da chiamare in MKInterfaceController. Passer un
dictionary contenente delle azioni da richiedere alla
main app.
2) Lazione (es. getUserCount) viene ricevuta dalla
main app, che risponder con un altro Dictionary
contenente delle informazioni, da visualizzare su
Apple Watch.
3) E possibile gestire gli errori di comunicazione
(blocco success, blocco failure).
4) Il pi湛 grande vantaggio 竪 che lapp su iPhone
risponde anche se non 竪 in esecuzione.
Metodo 2
Share Data Cache con NSUserDefaults e App Groups.
1) E un metodo gi rodato, e funziona in maniera simile
alle estensioni introdotte da Apple in iOS 8.
2) Si utilizza per condividere dati tra elementi eseguiti su
iPhone, appartenenti allo stesso gruppo, che condividono
una sandbox comune.
3) Invece del metodo standardDefaults di NSUserDefault,
si usa initWithSuite: che permette di salvare e leggere i
dati utilizzando NSUserDefaults tra pi湛 eseguibili.
4) Non cambia nulla dal classico NSUserDefaults a cui gli
sviluppatori iOS sono abituati.
5) Consigliato solo per i dati meno dinamici. Non c竪
alcun modo per essere avvisati sul cambiamento di un
valore in NSUserDefaults.
Metodo 3
Update Callbacks usando il Darwin Noti鍖cation
Center
1) E una API di basso livello scritta in C.
2) Esiste una libreria wrapper che ne sempli鍖ca
lutilizzo: MMWormhole.
3) E simile a NSUserDefaults, ma permette di
ricevere aggiornamenti al cambio dei valori.
4) Usa il KVO tramite il quale si possono ricevere
noti鍖che solo quando stiamo realmente utilizzando
lapp. Mentre lo schermo di Apple Watch 竪 spento,
possiamo decidere di non comunicare con il telefono,
e di sincronizzarsi solo quando se ne ha necessit.
Quale usare?
DIPENDE.
Una buona soluzione per la stragrande
maggioranza dei casi 竪 una combinazione dei
metodi 1 & 3.
openParentApplication:reply: per il trigger delle
azioni start/pause/resume (ad esempio per
richiedere i dati da una API).
+
MMWormhole per laggiornamento dei dati
persistenti.
Cose da non
dimenticare
 Per sviluppare unapp per Apple
Watch 竪 comunque necessario
realizzare la corrispettiva app per iOS.
 Senza iPhone non si va da nessuna
parte.
 Con WatchOS 2 le regole del gioco
cambiano signi鍖cativamente.
WatchOS 2
Novit in WatchOS 2
 Le app girano nativamente su Apple Watch.
 Le performance delle app sono notevolmente
superiori.
 Le app terze sfruttano le funzioni hardware di Apple
Watch: accesso a Taptic Engine, Digital crown,
Accelerometro, Cardiofrequenzimetro, Altoparlante,
Microfono.
App che gi sfruttano le
potenzialit di WatchOS 2
Ping usa laccelerometro per
misurare la velocit del tuo swing
quando giochi a golf.
Insteon usa la Digital Crown per
controllare le luci della casa.
Per gli sviluppatori c竪
tanto altro
Fonte: raywenderlich.com
Progettazione per Apple Watch - Todi Appy Days 2015
Share Data su WatchOS 2
Le app che girano nativamente su WatchOS 2 necessitano di
tenere in sincronizzazione i dati tra lapp per Apple Watch e
quella su iPhone.
Non ci sono container condivisi con App Group.

Apple introduce WCSession. Le sessioni sono la radice da cui
partono tutte le comunicazioni da e verso lapp WatchOS.
Ogni sessione gestisce le informazioni ad alto livello: capisce
se il dispositivo in uso ha un Apple Watch abbinato, se
lapplicazione 竪 installata sullorologio, se lapplicazione si
trova a tutto schermo, ed altro ancora.
WCSession
 E possibile accedere ad una sessione e inviare dati
attraverso esso da qualsiasi punto dellapp.
 Le informazioni da una sessione vengono ricevute in un
unico posto incaricato.
 La sessione va attivata su entrambe le app (solitamente
nellAppDelegate, ma pu嘆 trovarsi ovunque).
 I dati vengono inviati in maniera intelligente (risparmio
batteria) non solo con la UI visibile, ma anche in
background.
 La Watch App non ha bisogno di sapere ogni cosa che
accade su iPhone e viceversa. Al momento opportuno
chieder: aggiornami su tutti gli aggiornamenti di stato
avvenuti 鍖no ad ora.
 WCSession ha un metodo updateApplicationContext:
che serve a mantenere i dati dellapp sempre aggiornati.
WCSession: esempio di invio
e ricezione
1) WCSession invia i dati dalla Watch App
attraverso updateApplicationContext:
2) Il delegato implementato sullapp iPhone,
otterr in
session:didReceiveApplicationContext: gli
ultimi dati inviati.
3) Se la Watch App imposta un nuovo context
prima che vengano inviati i dati precedenti, la
copia dei dati precedenti viene automaticamente
ignorata a favore dei nuovi dati.
WCSession: garantire la
consegna dei dati
E se i dati che dobbiamo inviare devono
essere sempre consegnati?
WCSession offre il metodo
transferUserInfo:
Funziona allo stesso modo di
updateApplicationContext: ma garantisce
che i dati vengano consegnati in ordine
FIFO.
WCSession: dati istantanei
sendData:
A volte 竪 necessario inviare i dati ad un dispositivo associato immediatamente,
senza attendere che i dati si sincronizzino.
Il metodo sendData: 竪 molto simile a openParentApplication:reply: di WatchOS
1, e permette a chi riceve di rispondere con un messaggio di conferma.
I dati vengono inviati immediatamente a condizione che:
1) Su Apple Watch lapplicazione sia attiva (anche a schermo spento).
2) iPhone ed Apple Watch siano associati e siano entrambi raggiungibili via
bluetooth.
Come si fa a decidere se usare la messaggistica istantanea o quella per le attivit
in background?
WCSession ha una property -> isReachable
WKInterfaceMap
 Contenuto non interattivo
 Pu嘆 essere con鍖gurato dinamicamente
 Massimo 5 annotazioni (pin o immagini)
 Un tap apre lapp Mappe di Apple
Personalizzazione della UI
Cosa 竪 con鍖gurabile:
- Altezza
-Larghezza
- Alpha
- Visibilit
- Dimensione del testo
ANCORA BEN LONTANO DA UIKIT
Tips per migliorare le
proprie app
 API Handoff
 Implementare animazioni (basate su
sequenze di immagini su WatchOS 1)
 Caching delle immagini
 Utilizzare WCSession (solo WatchOS 2)
 Non reinventare la ruota: sfruttare a
pieno le potenzialit dei framework di
Apple
Impatto di Apple Watch nel
settore retail
Beacon + Internet
Fonte: 20 Ways The Apple Watch can impact the Retail
experience https://medium.com/@jpeddycoart/20-ways-the-
apple-watch-can-impact-the-retail-experience-442095859b11
Navigazione in store Checklist
Real time feedback Cross Selling
Recensioni Contenuti solo in-store
Prodotti contestuali Acquisti degli amici
Non 鍖nisce qui
1. Pagamenti (Apple Pay)
2. Fitness
3. Salute
4. IOT
5. Comunicazioni e feedback
Fonte: 5 Ideas for the Apple Watch https://medium.com/
backchannel/5-ideas-for-apple-watch-393a7a16f8a1
- Usare Apple Watch in maniera
creativa
- Interazione con il mondo esterno,
non limitarsi alla sola visualizzazione
di contenuti
- Estensione di te
Le s鍖de
Navigazione per sensazioni
Non dimenticare nulla
Musica che risponde alla vostra attivit
Salva una vita
Cerca qualcuno vicino a te
Previsioni di vendita nel settore
wearable
Fonte: BetaNews Giugno 2015
Conviene investire nello
sviluppo per Apple Watch?
*Stima degli analisti
1) 3 milioni di Apple Watch venduti *
2) WatchOS 2
3) Poca concorrenza sullo store
4) Tante potenzialit nel settore retail
5) Settore Health & Fitness in rapida crescita
6) Opportunit nel settore IOT
7) Un mercato potenzialmente enorme e semi
inesplorato
Non fate la guerra,
fate gli sviluppatori.
Grazie per lattenzione

More Related Content

Progettazione per Apple Watch - Todi Appy Days 2015

  • 1. WEARABLE LAB: PROGETTAZIONE PER APPLE WATCH Paolo Musolino Erik Peruzzi 26 Settembre 2015
  • 2. Erik Peruzzi iOS Software Engineer Of鍖cina 31 Twitter: @ErikPeruzzi email: erik.peruzzi@gmail.com Paolo Musolino iOS Software Engineer IQUII srl Twitter: @pmusolino email: pmusolino@gmail.com
  • 4. Force touch Bluetooth 4.0 low energy TAPTIC Engine Digital Crown e molto altro.
  • 6. Oltre 10000 app gi disponibili Fonte: Apple Keynote 9 Settembre 2015
  • 7. App fornite da Apple: Possono funzionare senza iPhone Hanno accesso ai dati dei sensori Possibilit di animazioni avanzate
  • 8. App terze parti: Girano interamente su iPhone Vengono installate quando la corrispettiva app viene installata su iPhone SDK (Watch Kit) limitato Con Watch Kit 2 cambiano le regole del gioco
  • 9. Non 竪 (ancora) possibile Utilizzare le app senza un iPhone connesso Realizzare app che girano solo su Apple Watch Creare animazioni avanzate Utilizzare i dati dei sensori biometrici e di movimento
  • 10. Accedere ai dati dellapp (parente) che gira su iPhone Creare animazioni basate sulle immagini Ricevere noti鍖che e visualizzarle Presentare delle viste e creare interfacce semplici Ma si pu嘆
  • 12. WatchKit App + WatchKit Extension
  • 13. WatchKit Extension Gira su iPhone Ha il suo ciclo di vita (willActivate, didActivate, etc) Cattura le interazioni dellutente dallapp installata su Apple Watch Aggiorna linterfaccia del watch da remoto Esegue piccoli e brevi task Accede ai dati condivisi con la WatchKit App
  • 14. WatchKit App Contiene risorse statiche Contiene linterfaccia gra鍖ca (Storyboard necessario) Non esegue codice
  • 15. iPhone App E lapp parente di quella presente su Apple Watch Pu嘆 processare task molto lunghi Pu嘆 accedere ai dati condivisi con Apple Watch Esegue processi che sono separati da quelli dellestensione.
  • 16. WatchKit come UIKit WatchKit UIKit WKInterfaceController UIViewController WKUserNotificationInterfaceController UIApplicationDelegate + UIAlertController WKInterfaceDevice UIDevice WKInterfaceObject UIView WKInterfaceButton UIButton WKInterfaceDate UILabel + NSDateFormatter WKInterfaceGroup UIScrollView WKInterfaceImage UIImageView WKInterfaceLabel UILabel WKInterfaceMap MKMapView WKInterfaceSeparator UITableView.separatorColor / .separatorStyle WKInterface際際滷r UIStepper + UI際際滷r WKInterfaceSwitch UISwitch WKInterfaceTable UITableView WKInterfaceTimer UILabel + NSDateFormatter + NSTimer
  • 17. WKInterfaceController Tutti i controller di WatchKit sono sottoclassi di WKInterfaceController E molto simile a UIViewController, ma con un lifecycle differente. Al suo interno possono essere inseriti molti dei componenti di WatchKit per realizzare interfacce complesse.
  • 18. WKInterfaceController gestisce gli elementi in una scena. UIViewController gestisce View e Subview. Gli oggetti dellinterfaccia non sono View, ma si comportano in modo simile. Inizializzazione usando initWithContext: override init(context: AnyObject?) { super.init(context: context) // ... }
  • 19. // MARK: - WKInterfaceController override func willActivate() { // ... } override func didDeactivate() { // ... } Solo 2 metodi per il Lyfecycle: That's it: 2 methods. No loading / unloading, no will / did appear / disappear, no animated:YES. Watch apps are simple by necessity. Communication between the iOS device driving the application and the watch is both time-consuming and battery- consuming, so all of the setup for the interface controller's scene is to be done in the initializer and willActivate. Both during and after didDeactivate, the Watch will ignore attempts to update the state of interface elements.
  • 20. Stack di navigazione Le applicazioni hanno una navigazione Gerarchica o Page-Based. The presentControllerWithName:context: method performs a page-based navigation equivalent to using the modal segue. The context argument allows you to pass data to the destination Interface Controller. //Hierarchical Navigation @IBAction func btnHierarchical() { pushControllerWithName(Page2, context: [segue: hierarchical, data:Passed through hierarchical navigation]) } //Page Based Navigation @IBAction func btnPagebased() { presentControllerWithName(Page2, context: [segue: pagebased, data: Passed through page-based navigation]) } Page2 竪 lidenti鍖cativo del successivo InterfaceController. The pushControllerWithName:context: method performs a hierarchical navigation equivalent to using the push segue. The context argument allows you to pass data to the destination Interface Controller. You navigate to the speci鍖c Interface Controller you want by using its identi鍖er.
  • 21. Progetto Xcode: come appare Targets: iOS, Tests, WatchKit Extension
  • 22. Page3.swift import WatchKit import Foundation class Page3: WKInterfaceController { override init(context: AnyObject?) { super.init(context: context) } override func willActivate() { super.willActivate() } override func didDeactivate() { super.didDeactivate() } }
  • 23. Aggiungiamo un Interface Controller per Page 3 allo Storyboard IC iniziale IC con navigazione gerarchica IC con navigazione page-based
  • 24. Settiamo gli attributi 稼艶鉛鉛i稼壊沿艶界岳看姻
  • 25. Con鍖guriamo i pulsanti @IBAction func btnPagebased() { presentControllerWithNames( [Page2, Page3], contexts: [ [segue: pagebased, data: Passed through page-based navigation], [segue: pagebased, data: Passed through page-based navigation]]) } Stiamo chiamando presentControllerWithNames:contexts: con i seguenti argomenti: Un array di stringhe contenenti gli identi鍖cativi degli Interface Controllers da visualizzare. Un array di oggetti da passare allInterface Controller di destinazione. Il primo oggetto sar passato a Page2, il secondo oggetto a Page3.
  • 26. RUN
  • 27. Page-Based Button -> Page 2 -> Left Swipe -> Page 3
  • 28. WKInterfaceObject E come una UIView, con propriet come alpha, hidden, allineamento orizzontale e verticale, width, height. Object Action Method Button - (IBAction)doButtonAction Switch - (IBAction)doSwitchMethod:(BOOL)on 際際滷r - (IBAction)do際際滷rAction:(float)value Table - (IBAction)doTableRowTapAction: (NSInteger)rowIndex Menu Item - (IBAction)doMenuItemAction The most striking di鍖erence is the lack of a frame. Instead of manually specifying coordinate points or setting up Auto Layout constraints, WatchKit interface objects are laid out in a grid according to their margins and respective ordering, which is reminiscent to working with a CSS framework like Bootstrap (or for you Rubyists out there, remember Shoes?).
  • 29. Oggetti principali con cui costruire app complesse WKInterfaceButton WKInterfaceTable WKInterfaceLabel WKInterfaceDate & WKInterfaceTimer WKInterface際際滷r & WKInterfaceSwitch WKInterfaceDate is a special kind of label that displays the current date or time. WKInterfaceTimer is similar, except that it displays a countdown until a speci鍖ed date.
  • 31. 3 Metodi per comunicare con la main app e scambiarsi informazioni Metodo 1: OpenParentApp Metodo 2: Share Data Cache con NSUserDefaults e App Groups Metodo 3: Update Callbacks usando il Darwin Noti鍖cation Center
  • 32. Metodo 1 openParentApplication:reply: 1) Da chiamare in MKInterfaceController. Passer un dictionary contenente delle azioni da richiedere alla main app. 2) Lazione (es. getUserCount) viene ricevuta dalla main app, che risponder con un altro Dictionary contenente delle informazioni, da visualizzare su Apple Watch. 3) E possibile gestire gli errori di comunicazione (blocco success, blocco failure). 4) Il pi湛 grande vantaggio 竪 che lapp su iPhone risponde anche se non 竪 in esecuzione.
  • 33. Metodo 2 Share Data Cache con NSUserDefaults e App Groups. 1) E un metodo gi rodato, e funziona in maniera simile alle estensioni introdotte da Apple in iOS 8. 2) Si utilizza per condividere dati tra elementi eseguiti su iPhone, appartenenti allo stesso gruppo, che condividono una sandbox comune. 3) Invece del metodo standardDefaults di NSUserDefault, si usa initWithSuite: che permette di salvare e leggere i dati utilizzando NSUserDefaults tra pi湛 eseguibili. 4) Non cambia nulla dal classico NSUserDefaults a cui gli sviluppatori iOS sono abituati. 5) Consigliato solo per i dati meno dinamici. Non c竪 alcun modo per essere avvisati sul cambiamento di un valore in NSUserDefaults.
  • 34. Metodo 3 Update Callbacks usando il Darwin Noti鍖cation Center 1) E una API di basso livello scritta in C. 2) Esiste una libreria wrapper che ne sempli鍖ca lutilizzo: MMWormhole. 3) E simile a NSUserDefaults, ma permette di ricevere aggiornamenti al cambio dei valori. 4) Usa il KVO tramite il quale si possono ricevere noti鍖che solo quando stiamo realmente utilizzando lapp. Mentre lo schermo di Apple Watch 竪 spento, possiamo decidere di non comunicare con il telefono, e di sincronizzarsi solo quando se ne ha necessit.
  • 35. Quale usare? DIPENDE. Una buona soluzione per la stragrande maggioranza dei casi 竪 una combinazione dei metodi 1 & 3. openParentApplication:reply: per il trigger delle azioni start/pause/resume (ad esempio per richiedere i dati da una API). + MMWormhole per laggiornamento dei dati persistenti.
  • 36. Cose da non dimenticare Per sviluppare unapp per Apple Watch 竪 comunque necessario realizzare la corrispettiva app per iOS. Senza iPhone non si va da nessuna parte. Con WatchOS 2 le regole del gioco cambiano signi鍖cativamente.
  • 38. Novit in WatchOS 2 Le app girano nativamente su Apple Watch. Le performance delle app sono notevolmente superiori. Le app terze sfruttano le funzioni hardware di Apple Watch: accesso a Taptic Engine, Digital crown, Accelerometro, Cardiofrequenzimetro, Altoparlante, Microfono.
  • 39. App che gi sfruttano le potenzialit di WatchOS 2 Ping usa laccelerometro per misurare la velocit del tuo swing quando giochi a golf. Insteon usa la Digital Crown per controllare le luci della casa.
  • 40. Per gli sviluppatori c竪 tanto altro Fonte: raywenderlich.com
  • 42. Share Data su WatchOS 2 Le app che girano nativamente su WatchOS 2 necessitano di tenere in sincronizzazione i dati tra lapp per Apple Watch e quella su iPhone. Non ci sono container condivisi con App Group. Apple introduce WCSession. Le sessioni sono la radice da cui partono tutte le comunicazioni da e verso lapp WatchOS. Ogni sessione gestisce le informazioni ad alto livello: capisce se il dispositivo in uso ha un Apple Watch abbinato, se lapplicazione 竪 installata sullorologio, se lapplicazione si trova a tutto schermo, ed altro ancora.
  • 43. WCSession E possibile accedere ad una sessione e inviare dati attraverso esso da qualsiasi punto dellapp. Le informazioni da una sessione vengono ricevute in un unico posto incaricato. La sessione va attivata su entrambe le app (solitamente nellAppDelegate, ma pu嘆 trovarsi ovunque). I dati vengono inviati in maniera intelligente (risparmio batteria) non solo con la UI visibile, ma anche in background. La Watch App non ha bisogno di sapere ogni cosa che accade su iPhone e viceversa. Al momento opportuno chieder: aggiornami su tutti gli aggiornamenti di stato avvenuti 鍖no ad ora. WCSession ha un metodo updateApplicationContext: che serve a mantenere i dati dellapp sempre aggiornati.
  • 44. WCSession: esempio di invio e ricezione 1) WCSession invia i dati dalla Watch App attraverso updateApplicationContext: 2) Il delegato implementato sullapp iPhone, otterr in session:didReceiveApplicationContext: gli ultimi dati inviati. 3) Se la Watch App imposta un nuovo context prima che vengano inviati i dati precedenti, la copia dei dati precedenti viene automaticamente ignorata a favore dei nuovi dati.
  • 45. WCSession: garantire la consegna dei dati E se i dati che dobbiamo inviare devono essere sempre consegnati? WCSession offre il metodo transferUserInfo: Funziona allo stesso modo di updateApplicationContext: ma garantisce che i dati vengano consegnati in ordine FIFO.
  • 46. WCSession: dati istantanei sendData: A volte 竪 necessario inviare i dati ad un dispositivo associato immediatamente, senza attendere che i dati si sincronizzino. Il metodo sendData: 竪 molto simile a openParentApplication:reply: di WatchOS 1, e permette a chi riceve di rispondere con un messaggio di conferma. I dati vengono inviati immediatamente a condizione che: 1) Su Apple Watch lapplicazione sia attiva (anche a schermo spento). 2) iPhone ed Apple Watch siano associati e siano entrambi raggiungibili via bluetooth. Come si fa a decidere se usare la messaggistica istantanea o quella per le attivit in background? WCSession ha una property -> isReachable
  • 47. WKInterfaceMap Contenuto non interattivo Pu嘆 essere con鍖gurato dinamicamente Massimo 5 annotazioni (pin o immagini) Un tap apre lapp Mappe di Apple
  • 48. Personalizzazione della UI Cosa 竪 con鍖gurabile: - Altezza -Larghezza - Alpha - Visibilit - Dimensione del testo ANCORA BEN LONTANO DA UIKIT
  • 49. Tips per migliorare le proprie app API Handoff Implementare animazioni (basate su sequenze di immagini su WatchOS 1) Caching delle immagini Utilizzare WCSession (solo WatchOS 2) Non reinventare la ruota: sfruttare a pieno le potenzialit dei framework di Apple
  • 50. Impatto di Apple Watch nel settore retail Beacon + Internet Fonte: 20 Ways The Apple Watch can impact the Retail experience https://medium.com/@jpeddycoart/20-ways-the- apple-watch-can-impact-the-retail-experience-442095859b11
  • 51. Navigazione in store Checklist Real time feedback Cross Selling
  • 52. Recensioni Contenuti solo in-store Prodotti contestuali Acquisti degli amici
  • 53. Non 鍖nisce qui 1. Pagamenti (Apple Pay) 2. Fitness 3. Salute 4. IOT 5. Comunicazioni e feedback Fonte: 5 Ideas for the Apple Watch https://medium.com/ backchannel/5-ideas-for-apple-watch-393a7a16f8a1
  • 54. - Usare Apple Watch in maniera creativa - Interazione con il mondo esterno, non limitarsi alla sola visualizzazione di contenuti - Estensione di te Le s鍖de
  • 57. Musica che risponde alla vostra attivit
  • 60. Previsioni di vendita nel settore wearable Fonte: BetaNews Giugno 2015
  • 61. Conviene investire nello sviluppo per Apple Watch? *Stima degli analisti 1) 3 milioni di Apple Watch venduti * 2) WatchOS 2 3) Poca concorrenza sullo store 4) Tante potenzialit nel settore retail 5) Settore Health & Fitness in rapida crescita 6) Opportunit nel settore IOT 7) Un mercato potenzialmente enorme e semi inesplorato
  • 62. Non fate la guerra, fate gli sviluppatori.