Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
-
Upload
codemotion -
Category
Mobile
-
view
169 -
download
1
Transcript of 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 Watch
S. Ferranti, F. Ingrassia, M. Passariello
ROME 18-19 MARCH 2016
LEI NON SA CHI SIAMO NOI
FrancescoSenior iOS Dev @ Freelance
SalvatoreSenior iOS Developer @
MarcoSenior iOS Consultant @
ESPERIENZA
5+ anni su progetti in ambito Finanziario, Telco, Media, B2C & Retail
LIBRO
Forse vi ricorderete di noi…
UN PO’ DI NUMERI
ricerca Juniper Research
ricerca IDC
21M di smartwatch venduti nel 2015 ~ 13M sono Apple Watch
15k+ app per Apple WatchApp Annie Dicembre 2015
18M di smartwatch venduti nel 2015 ~ 8.8M sono Apple Watch
IL PERCHÉ DI QUESTO TITOLO
AnonimoMobile Solution Architect
DI COSA PARLEREMO OGGI
• Utilizzo di Apple Watch
• Architettura• Fruizione
dell’informazione• Watch Connectivity
QUELLO CHE SI CHIEDONO UN PO’ TUTTI
RACCONTAMI DI NUOVO
A COSA SERVE APPLE WATCH?
A COSA SERVE APPLE WATCH
• Ti fornisce le informazioni che vuoi, dove e quando ti servono
• Ti aiuta a sbrigare in pochi secondi le attività di ogni giorno
• Ti mette subito in contatto con le persone a cui tieni di più
Da Apple Store Italiahttp://www.apple.com/it/watch/watch-reimagined/
PIÙ PRESENTI E ANCORA PIÙ CONNESSI
Vita reale Prendi il telefono
Usa il telefono
Più connessi alle persone intorno a voi e a quelle che non lo sono
Presa in prestito da Google
Architettura di Apple Watch
EXTENSION
Extensions: rendere disponibili all’esterno dell’applicazione le funzionalità dell’applicazione stessa
ARCHITETTURA
WatchExtension
Watch App
Applicazione contenitore presente su iPhone
Extension Apple Watch dell’applicazione iPhone, contiene la logica applicativa
Contiene tutto ciò che riguarda la UI. Assets e Storyboard no XIB in Apple Watch
iPhone App
ARCHITETTURA DI WATCHOS 1
Watch App
WatchExtension
iPhone App
WATCHOS 1 Framework
WatchKit
ARCHITETTURA DI WATCHOS 2
Watch App
WatchExtension
iPhone App
ARCHITETTURA DI WATCHOS 2
Watch App
WatchExtension
• Indipendenza, in termini di esecuzione, dalla controparte iPhone
• UI più reattiva (no overhead di comunicazione)
• Le chiamate di rete vengono effettuate direttamente
• Accesso ai sensori (battito cardiaco, accelerometro e corona digitale (limitato)
WATCHOS 2 Frameworks
• ClockKit• Contacts• Core Data• Core Foundation• Core Graphics• Core Location• Core Motion• EventKit• Foundation
• HealthKit
• HomeKit• Image I/O• MapKit• Mobile Core
Services• PassKit• Security• Watch Connectivity• WatchKit
Nati per watchOS
Ereditati da iOS
STRUTTURA
Watch App
Watch Extension
WATCH APP
Risorse Storyboard
WATCH EXTENSION
ExtensionDelegate
active
inactive
not running
InterfaceControllerinit
awakeWithContext:
willActivate
didAppear
didDeactivate
WATCH EXTENSION
ExtensionDelegate
active
inactive
not running
InterfaceControllerinit
awakeWithContext:
willActivate
didAppear
didDeactivate
self.view.addSubview(..)
COME FUNZIONA (1/4)
WatchExtension
Watch App Storyboa
rd
COME FUNZIONA (2/4)
WatchExtension
Watch App Storyboa
rd
label.setText(“txt”)
COME FUNZIONA (3/4)
WatchExtension
Watch App Storyboa
rd
label.getText()
COME FUNZIONA (4/4)
L’InterfaceController è responsabile del mantenimento dello stato dei
componenti dell’interfaccia
ALTRI VINCOLI
Ogni componente grafico è in realtà un oggetto proxy che estende
WKInterfaceObject
Il controller può solo agire su un set ristretto di parametri esposti, solo in
scrittura
ALTRI VINCOLI
Il controller agisce esclusivamente sui componenti già presenti nello
storyboard
Non è possibile aggiungere o rimuovere componenti e runtime
Non è possibile sovrapporre componenti…
LAYOUT
Layout model completamente differente da quello utilizzato su iOS
I componenti sono posizionati consecutivamente in base a proprietà
dell’elemento stesso e del suo contenitore
LAYOUT
FLOW LAYOUT
InterfaceController
FLOW LAYOUT
InterfaceControllerInterfaceObject
InterfaceObject
FLOW LAYOUT
InterfaceController
InterfaceGroup
InterfaceGroup
FLOW LAYOUT
InterfaceController
FLOW LAYOUT - DIRECTION
InterfaceController
321
FLOW LAYOUT - DIRECTION
InterfaceController
1
2
FLOW LAYOUT - DIRECTION
InterfaceController
1
2
DEMO
NAVIGAZIONE - HIERARCHICAL
PUSH
NAVIGAZIONE - HIERARCHICAL
PUSH
BACK
NAVIGAZIONE – PAGE BASED
NEXT PAGE
NAVIGAZION - MODAL
PRESENT
DISMISS
NAVIGAZIONE - INTERAZIONE FRA LE MODALITÀ
Page-Based
Modal
Hierarchical
NAVIGAZIONE - INTERAZIONE FRA LE MODALITÀ
NAVIGAZIONE - INTERAZIONE FRA LE MODALITÀ
Page-Based
Modal
Hierarchical
NAVIGAZIONE - INTERAZIONE FRA LE MODALITÀ
Page-Based
Modal
Hierarchical
NAVIGAZIONE - INTERAZIONE FRA LE MODALITÀ
Page-Based
Modal
HierarchicalPUS
H
PRESENT
PRESENT
PRES
ENT
NEXT PAGE
NEXT PAGE
PIÙ PRESENTI E ANCORA PIÙ CONNESSI
Vita reale Prendi il telefono
Usa il telefono
Più connessi alle persone intorno a voi e a quelle che non lo sono
Presa in prestito da Google
TEMPO DI INTERAZIONE
Dimensioni dello schermo
Tem
po d
i int
eraz
ione
Fruizione dell’informazione
Interazioni
FRUIZIONE DELL’INFORMAZIONE
INTERAZIONI - GESTURE
INTERAZIONI – CORONA DIGITALE
INTERAZIONI – FORCE TOUCH
INTERAZIONI – DETTATURA VOCALE
INTERAZIONI - ACCELEROMETRO
App, Glance, Notifiche e Complication
FRUIZIONE DELL’INFORMAZIONE
GLANCE
NOTIFICHE
NEXT PAGE
short looks
Long looks
static
dynamic
• ClockKit• Provider di dati• Timeline• Complication Template• Famiglie di
complication
COMPLICATION
LIMITE ATTUALE
Non può esistere un’applicazione Apple
Watch senza un’applicazione
iPhone
FRAMEWORK
Watch Connectivity
WATCH CONNECTIVITY
Fornisce un canale bidirezionale di comunicazione tra
un’iPhone App ed una Watch App
Note: Compatibile solamente con iPhone
TIPOLOGIE DI COMUNICAZIONE
Application Context
User Info Transfer
File Transfer
Background Foreground
Live Messaging
INIZIALIZZAZIONE DI WATCH CONNECTIVITY
if (WCSession.isSupported()) {let session = WCSession.defaultSession()session.delegate = selfsession.activateSession()
}
Note: Sempre vero su Apple Watch
Note: Metodo asincrono (da watchOS 2.1+ diventa sincrono)
SESSIONE DI COMUNICAZIONE
Watch App
WatchExtension
iPhone App
2) session.reachability == true optional func sessionReachabilityDidChange(_ session: WCSession)
1) session.paired == true
1
2
3) session.watchAppInstalled == true session.watchDirectoryURL != nil
3
COMUNICAZIONE IN BACKGROUND
Overview• Coda di contenuti• Sistema intelligente di trasferimento dati• Contenuti non trasferiti immediatamente• Raccomandato se non è richiesta una comunicazione
istantanea
APPLICATION CONTEXT
Watch App
WatchExtension
iPhone App
1ABC
1) func updateApplicationContext(_ applicationContext: [String : AnyObject])
2) optional func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject])
2
AC
applicationContext receivedApplicationContext
APPLICATION CONTEXT
Considerazioni• L’informazione ricevuta sarà sempre la più recente e/o
rilevante• Le informazioni sono inviate mediante una coda
sequenziale• L’ultima informazione sovrascriverà sempre quella
precedentemente ricevuta• Le informazioni sono strutturate sotto forma di
dizionari chiave-valore• Particolarmente consigliata per la maggior parte delle
applicazioni watchOS• Ottimo per la gestione degli aggiornamenti nei Glance
USER INFO TRANSFER
Watch App
WatchExtension
iPhone App
1A B C
1) func transferUserInfo(_ userInfo: [String : AnyObject])2) optional func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])
2
outstandingUserInfoTransfers
USER INFO TRANSFER
Considerazioni• Le informazioni sono inserite in una coda d’invio• La coda viene smaltita in maniera sequenziale• È possibile sempre sapere lo stato della coda d’invio,
mediante la property outstandingUserInfoTransfers
FILE TRANSFER
Watch App
WatchExtension
iPhone App
2A B C
1) func transferFile(_ file: NSURL, metadata metadata: [String : AnyObject]?)
2) optional func session(_ session: WCSession, didReceiveFile file: WCSessionFile)
1
~/Documents/InboxoutstandingFileTransfers
FILE TRANSFER
Considerazioni• Gli oggetti da trasferire sono organizzati in modo
simile al sistema User Info Trasfer• L’invio dei file è strutturato con una coda d’invio• È possibile accedere alle informazioni di ogni singolo
oggetto della coda• È possibile includere delle informazioni extra sotto
forma di meta dati• Il file ricevuto deve essere copiato in un’area di
salvataggio dell’applicazione poiche, dopo l’esecuzione del delegato, esso sarà automaticamente rimosso dal dispositivo
COMUNICAZIONE IN FOREGROUND
Overview• Permette lo scambio immediato d’informazioni fra due
dispositivi• Le informazioni sono inviate mediante una coda
sequenziale• Permette di serializzare degli oggetti custom• È consigliabile inviare delle informazioni di piccola
dimensione
LIVE MESSAGING
Watch App
WatchExtension
iPhone App
1) Entrambe le applicazioni sono raggiungibili ed in Foreground
2) La Watch App può iniziare una comunicazione avviando la iPhone App in Background rendendola quindi raggiungibile
1
2
LIVE MESSAGING
Watch App
WatchExtension
iPhone App
1A B
1) func sendMessage(_ message: [String : AnyObject], replyHandler replyHandler: (([String : AnyObject]) -> Void)?, errorHandler errorHandler: ((NSError) -> Void)?)
2) optional func session(_ session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler replyHandler: ([String : AnyObject]) -> Void)
2C D
LIVE MESSAGING
Considerazioni• Permette lo scambio immediato d’informazioni fra due
dispositivi• Le informazioni sono inviate mediante una coda
sequenziale• Permette di serializzare degli oggetti custom• È consigliabile inviare delle informazioni di piccola
dimensione
TIPS
WatchKit Development TipsOptimize your WatchKit apps with these tips and best practices.
Reference:https://developer.apple.com/watchkit/tips/
WATCHKIT DEVELOPMENT TIPS (1/2)
Performance• Ridurre al minimo il traffico• Inizializzare i controllers velocemente• Caricamento dei contenuti in modalità Lazy• Aggiornare solo gli elementi che cambiano• Semplificare le scene dei controllers• Migliorare i tempi di caricamento, con un minor
numero di righe per le tabelle
WATCHKIT DEVELOPMENT TIPS (2/2)
Consigli generali• Effettuare animazioni mediante sequenze di immagini• Utilizzare i settings bundle• Utilizzare il sistema di dettatura vocale• Salvare le sequenze di immagini sull’Apple Watch• Ripristino dello stato per l’applicazione
Comunicazione con iPhone• L’iPhone App dovrebbe fare la maggior parte del
lavoro• Utilizzare le API Handoff• Condividere i dati mediante App Groups• Utilizzare Frameworks per condividere codice
DOMANDE?
FORSE TE VOLEVI CHIEDERE
“CHE ORE SONO?”
Thanks!
ROME 18-19 MARCH 2016
All pictures belongto their respective authors
@kajinka13@effecomefra@j4s0n13
Salvatore
Francesco
Marco