Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch

Post on 09-Jan-2017

169 views 1 download

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