Con l’introduzione dell’iPad, l’iPhone SDK 3.2 supporta ora lo sviluppo di tre tipi di applicazioni: iPhone Apps, iPad Apps e Universal Apps.

iPhone Applications: Le iPhone app sono applicazioni ottimizzate per girare su iPhone e iPod Touch. Queste applicazioni possono essere avviate anche su iPad nella loro risoluzione originale o eventualmente possono essere impostate durante l’esecuzione in visualizzazione “raddoppiata” adatta al display più grande del nuovo dispositivo Apple.

iPad Applications: iPhone SDK 3.2 supporta lo sviluppo di applicazioni per iPad ottimizzate per sfruttare i vantaggi offerti dalle nuove funzionalità del tablet Apple, queste applicazioni saranno però ovviamente compatibili solo con iPad.

Universal Applications: iPhone SDK 3.2 supporta infine lo sviluppo di applicazioni universali, compatibili con tutti i dispositivi su cui è montato iPhone OS.

Questo documento illustra le linee guida che dovremmo seguire per progettare applicazioni universali.

Un’universal app può riconoscere su quale dispositivo sta girando l’applicazione stessa e predisporre automaticamente la miglior esperienza d’uso per quel dispositivo. Universal App correttamente progettate devono tener conto delle caratteristiche e delle funzionalità hardware di un’unico ipotetico dispositivo, ovvero bisogna utilizzare le sole caratteristiche presenti su tutti i dispositivi iPhone OS.

Apple raccomanda a tutti gli sviluppatori iPhone OS di progettare le interfacce utente, di scrivere il codice e costruire le loro applicazioni come Universal Applications. Creare applicazioni universali rende la vita più semplice a tutti.

Agli sviluppatori in quanto avranno una sola applicazione da gestire nell’App Store, anzichè più versioni dello stesso programma e agli utenti in quanto le Universal App acquistate gireranno su tutti i loro dispositivi.

Il supporto SDK per la creazione di Universal apps sarà presto disponibile tra la documentazione ufficiale Apple, per iniziare, possiamo però comunque fare molto fin da subito!

Progettare Universal Apps

Se state pensando di ottimizzare una vostra applicazione iPhone esistente o di creare una nuova applicazione che sfrutti i vantaggi del nuovo iPad, dovrete considerare di progettare la vostra app come un’Universal app.

Un giusto approccio alla progettazione di un’applicazione universale per iPhone OS è quello di iniziare a pensare come l’interazione dell’utente possa essere separata dalla stesura del codice del programma.
Le classi dell’iPhone SDK e la logica del paradigma di programmazione model-view-controller (MVC) incoraggiano una netta separazione tra i dati del vostro programma e le viste utilizzate per rappresentarli.

Il primo step nella creazione di Universal App è quello di progettare l’interfaccia utente per ogni dispositivo, un design quindi per iPad e un’altro per iPhone/iPod. La maggior parte del vostro lavoro di progettazione deve essere influenzato dalle funzionalità che volete mostrare in ognuno dei differenti form-factors.

I seguenti sono alcuni esempi di caratteristiche su cui ragionare durante la progettazione di interfacce per iPad e iPhone/iPod:

Orientamento Usate l’accelerometro. E’ possibile farlo in qualunque applicazione per determinare l’orientamento di un dispositivo iPhone OS. Con questa funzionalità un’applicazione può migliorare l’esperienza d’uso dell’utente alternando differenti layout, (in landscape o portrait) ottimizzati secondo l’orientamento corrente del device. Questa funzionalità è supportata ad esempio da numerose applicazioni iPhone, come Mail, iPod e Foto. Inoltre, mentre non è sempre desiderabile il supporto all’orientamento su di un’applicazione per iPhone, è molto imporante che tutte le applicazioni che gireranno su iPad abbiano questo supporto.
Layout Sfruttate il grande display dell’iPad per offrire agli utenti l’accesso a più informazioni possibili in un unico luogo, per focalizzare l’attenzione sui contenuti che desidera l’utente e per offrire più realismo e una grafica mozzafiato alle interfacce delle vostre applicazioni.
Gesti Le dimensioni maggiori del display dell’iPad offrono una più ampia varietà di possibili comandi gestuali usabili nelle nostre applicazioni. Per esempio, è più facile che un utente possa effettuare un comando usando quattro dita su iPad che su iPhone o iPod touch. Un’applicazione universale ben progettata, però, dovrebbe prevedere differenti comandi gestuali, in base al dispositivo su cui verrà avviata l’applicazione stessa.
Viste divise Una vista divisa (split view) è una caratteristica offerta dal solo iPad che offre un nuovo modo ad un’applicazione di rappresentare le informazioni a video. E’ importante condiserare attentamente come sfruttare i vantaggi offerti dalle split view, allo stesso modo occorre provvedere che gli utenti riescano ad accedere alle stesse informazioni quando avviano l’applicazione da iPhone o iPod Touch.
Popovers Come per le Split View, i popovers rappresentano un nuovo modo per presentare le opzioni agli utenti. Un’universal app ben progettata offrirà le stesse opzioni anche su iPhone e iPod Touch usando per questi, però, le tecniche già conosciute di progettazione di interfacce utente.
Caratteristiche Hardware iPad, iPhone e iPod touch condividono molte delle stesse funzionalità hardware. Se però sfruttate una caratteristica hardware non disponibile in un’altro dispositivo, dovreste comunque garantire e trattare questa mancanza nel migliore dei modi possibile. Per esempio, un’applicazione che gira su iPad o iPod touch non dovrebbe presentare l’opzione di “scattare una foto” con la fotocamera, ma dobrebbe presentare la possibilità di scegliere un’immagine dalla propria libreria di foto.

Stesura di codice in forma condizionale

Al fine di raggiungere i vostri obiettivi per una giusta progettazione di applicazioni universali, dovrete organizzare il vostro codice in modalità condizionale, per determinare, ad esempio, la disponibilità o meno di funzioni (dipendendi dal device usato) durante l’esecuzione del programma.

La stesura di codice condizionale vi permetterà di essere sicuri di caricare le giuste risorse disponibili e di usare le sole funzionalità supportate dal dispositivo per sfruttare adeguatamente l’hardware disponibile.

Strutturate il vostro codice condizionale nel modo più granulare possibile. Provate ad evitare di chiedervi quale sia il tipo di dispositivo o la versione del Sistema Operativo installato. Se avete la necessita di lavorare con un metodo, ad esempio, verificate l’esistenza di questo, piuttosto che chiedervi se siete in esecuzione su iPhone piuttosto che su iPad. Ragionare ad un livello più basso permetterà alle vostre app di ottenere automaticamente nuove funzionalità quando un metodo o una classe viene introdotta con un aggiornamento del sistema operativo. La vostra applicazione avrà la nuova funzionalità senza aver dovuto necessariamente creare un aggiornamento.

Questi sono alcuni elementi per cui potrebbe essere necessario strutturare il codice in forma condizionale:

Resources File di Interface Builder (.NIB). Nel vostro codice, dovrete prevedere il recupero delle informazioni che indicano su quale piattaforma si sta eseguendo l’applicazione e di conseguenza caricare le giuste risorse. Per esempio, per essere sicuri di presentare la giusta interfaccia utente nella vostra applicazione, potreste aver bisogno di due file .NIB per un’unica vista, una che contiene i controlli per la versione iPhone e l’altra per l’interfaccia utente che verrà caricata su iPad. Il vostro codice deve verificare su quale dispositivo sta girando l’applicazione e quindi scegliere e caricare il giusto file NIB.
Grafica. Ovviamente anche qui vorrete molto probabilmente caricare risorse differenti in base al dispositivo utilizzato. Per esempio la grafica su iPad dovrebbe essere più grande rispetto a quella per iPhone.
Classi Alcune classi Cocoa Touch sono disponibili solo in alcuni dispositivi. Prima di utilizzare una classe, dovrete verificare se la classe stessa è disponibile. Per esempio, iPhone OS 3.2 permette alle vostra app di condividere documenti con altre applicazioni. Questa caratteristica è presente però solo su iPad. Il vostro codice deve verificare l’esistenza della classe UIDocumentInteractionController class usando NSClassFromString() che restituirà un oggetto di classe valido. Se la classe esiste, il vostro codice potrà usare questa classe e condividere il documento. Se non esiste, dovreste trovare un metodo per “girarci attorno” in modo che l’applicazione lavori correttamente anche sul dispositivo che non supporta la condivisione di documenti.
Metodi e funzioni Alcuni dispositivi supportano diversi metodi e funzioni. Se state usando funzioni su un device che non esistono sugli altri, dovrete effettuare le opportune verifiche prima di chiamare questi metodi. La classe principale per la maggior parte degli oggetti Cocoa, NSObject, supporta la verifica in runtime della disponibilità dei metodi. I metodi instancesRespondToSelector e respondsToSelector vi permettono di determinare se un oggetto, o una sua superclasse, possiede il metodo che volete utilizzare nel dispositivo su cui state eseguendo l’applicazione.
Nuove API nei Framework esistenti Nuove API aggiunte a framework esistenti lavorano allo stesso modo. Per esempio, UIgraphics su iPad aggiunge il supporto ai file PDF. In questo caso UIGraphics esiste in tutte le versione di iPhone OS, non dovrete quindi verificare il framework, ma le specifiche funzioni (in questo caso PDF) che vorrete usare.
Funzionalità Hardware A volte è necessario rilevare se un componente hardware è disponibile. Dovrete usare la stessa metodologia usata per vedere se un metodo software o una funzione è disponibile, per esempio, se state cercando di determinare se il dispositivo in cui si sta eseguendo l’applicazione ha una fotocamera, dovreste interrogare l’UIImagePickerController e la fonte UIImagePickerControllerSourceTypeCamera, e prendere poi la strada appropriata, a livello di programmazione, in base alla risposta che otterrete.

Creare un’Universal App darà ai vostri utenti la miglior esperienza possibile di utilizzo, non importa in che dispositivo girerà la vostra applicazione. Renderà inoltre la gestione delle vostre applicazioni in App Store più semplice possibile.

Progettate bene, scrivete un buon codice in forma condizionale e creerete ottime Applicazioni!

(Tradotto da documento ufficiale Apple “Introducing Universal Applications for iPhone OS“)