Ciao a tutti e benvenuti in questo nuovo appuntamento della nostra rubrica “Tutorial Pratici di programmazione iPhone e iPad”. Oggi voglio parlarvi di un argomento molto interessante e di cui si sente parlare davvero poco in giro: gli URL Schemes!
Vi siete mai chiesti come fanno alcune applicazioni ad avere la funzione “Apri in Safari” usata ad esempio per aprire una pagina web nel browser nativo dei nostri iDevices o come fanno i link video ad aprire direttamente l’app YouTube o ancora come si fa a passare un indirizzo all’applicazione Mappe? In questo tutorial vedremo proprio com’è possibile che tutto ciò accada grazie agli URL Schemes, ma non solo: impareremo a creare il nostro URL Scheme personalizzato, che useremo per far aprire la nostra applicazione allo stesso modo degli esempi citati.
Introduzione agli URL Schemes
Sveliamo il primo mistero: come si fa ad aprire Safari o un’altra applicazione sul nostro iPhone o iPad!
Dalla nostra applicazione, come accennato, possiamo far in modo di aprire le applicazioni native Mail, Safari, Telefono, Messaggi e Mappe semplicemente inviando un’istruzione del tipo:
[[UIApplication sharedApplication] openURL:url].
La variabile url che ho usato nell’istruzione sopra non è altro che uno schema per gli indirizzi URL. Questo funziona come un vero e proprio indirizzo web (mentre non lo è di per se). Vediamo qualche esempio.
Quando la nostra variabile sarò del tipo:
[NSURL urlWithString:@"http://devapp.it"]
Si aprirà l’applicazione nativa Safari caricando la pagina del sito web cui la stringa che compone l’URL fa riferimento;
Se invece il nostro URL è del tipo:
[NSURL urlWithString:@"mailto:indirizzo@devapp.it"]
si aprirà l’app Mail e un nuovo messaggio verrà creato inserendo indirizzo@devapp.it tra i destinatari dell’e-mail. Quindi non solo apriamo un’applicazione nativa, ma passiamo ad essa alcuni parametri, senza i quali questa funzionalità perderebbe la sua “magia”. Allo stesso modo si comportano le altre applicazioni quando riconoscono un URL a loro noto.
Ma come fanno a sapere che devono aprirsi e cosa devono presentare una volta aperte?
Apple mette a disposizione degli sviluppatori molte APIs. Tra queste c’è n’è una in grado di riconoscere le richieste di apertura di indirizzi URL tramite il messaggio [[UIApplication sharedApplication] openURL:url] e, nel caso in cui l’indirizzo combaci con la serie di URL Schemes impostati in un’applicazione, apre quell’applicazione.
La nostra app, poi, riceverà la chiamata alla funzione booleana “handleOpenURL” che si occupa di gestire l’apertura dell’app. Cosa viene fatto durante l’apertura dell’app è quindi gestito da questo metodo secondo il tipo di schema riconosciuto.
Anche Safari, quando digitate un indirizzo, manda quel messaggio, infatti, se provate a scrivere nel campo “indirizzo” di Safari per iPhone “tel:1-408-555-5555“, l’applicazione nativa Telefono si aprirà con il numero inserito nell’indirizzo pre-impostato per voi. Stesso discorso vale per tutte le app e i loro indirizzi URL.
Cosa sono allora questi schemi?
In pratica si tratta di una sorta di modello per un URL, se avete notato, nella pratica, ogni indirizzo mostrato negli esempi sopra ha una sua struttura, questa è rappresentata da uno schema specifico. Un indirizzo modello, quindi, sarà del tipo:
urlScheme://identifier?query#fragment
dove i campi urlScheme e identifier sono indispensabili al funzionamento dell’indirizzo, mentre i campi query (ricerca) e fragment (meglio interpretato come “sezione”, secondo me) sono opzionali.
Per maggiori informazioni sugli URL Schemes potete visitare questa pagina su Wikipedia (purtroppo non è disponibile in versione italiana).
URL Scheme personalizzati
Ma veniamo alla parte più bella! Apple permette a tutti gli sviluppatori di creare URL Scheme personalizzati per le proprie esigenze!
Molte app, infatti, ne hanno uno. Se avete l’app ufficiale di Twitter per iOS installata sul vostro iPhone, iPod Touch o iPad, ad esempio, e provate a inserire in Safari l’indirizzo twitter://user?screen_name=gtranchedone, si aprirà la pagina del mio profilo Twitter direttamente nell’applicazione Twitter ufficiale.
Ma quali sono i vantaggi derivanti dall’utilizzo degli URL Schemes?
Innanzitutto avere la possibilità di aprire altre applicazioni dall’interno della nostra offre moltissime occasioni per integrare nuovi servizi da offrire ai nostri utenti. Ciò non solo renderà la nostra app più utile ma migliorerà anche l’esperienza di chi la usa. Offrire questo tipo di integrazione è, secondo me, una delle possibilità meno sfruttate nello sviluppo di app per iOS. L’unica “controindicazione” che si riceve dall’aprire app di terze parti è che l’utente è costretto a uscire dalla vostra. A tal proposito occorre però fare alcune osservazioni:
- non tutte le app sono pensate per essere usate per un lungo periodo di tempo continuato, specialmente in ambiente mobile (pensiamo a un’app per creare tasks come Things della Cutured Code o un’app che serva da dizionario bilingue);
- dobbiamo integrare app che effettivamente possano essere utili ai nostri utenti e valutare se e quando sia opportuno permettere all’utente di aprire queste applicazioni;
- se prendiamo ad esempio l’app ToDo di Appigo, che offre un’ottima API per l’integrazione con app di terze parti, questa è costruita in modo tale da permettere di specificare lo URL Scheme della propria app quando le mandiamo una richiesta di apertura, permettendo all’utente di tornare alla nostra app una volta che ha finito di utilizzare ToDo. Perché non fare lo stesso con le nostre applicazioni? 😉
Pensate inoltre al vantaggio di avere la nostra applicazione pubblicizzata, ad esempio, all’interno di altre applicazioni che ne integrano i servizi! Per gli utenti sarebbe molto più facile scoprire la nostra applicazione e/o essere orientati ad acquistare la nostra app piuttosto che un’altra concorrente! E le possibilità di sponsorship “gratuite” a questo punto diventano moltissime!
Aggiungere un’ URL Scheme alla propria applicazione iOS
Eccoci giunti al cuore di questo tutorial. Vedremo ora come aggiungere uno schema URL alla nostra applicazione iPhone o iPad! L’operazione è molto semplice e richiede non più di 5 minuti. Ecco i passi da seguire:
- La prima cosa da fare è aprire il progetto della nostra app (o crearne uno nuovo) e andare nel nostro info.plist. Qui, dovremo aggiungere una nuovo elemento alla lista, possiamo farlo semplicemente cliccando con il tasto secondario del mouse/trackpad su una qualsiasi riga e cliccando su “Add Row”.
- Selezioniamo quindi la riga appena creata e impostiamone la key a “URL types”.
- Espandiamo la struttura che è stata creata per noi fino a trovare la chiave “URL identifier” e impostiamone il valore alla stringa “path” (o una qualsiasi altra stringa a nostra scelta).
- Selezioniamo la riga “URL identifier” e clicchiamo sul segno (+) per aggiungere un nuovo elemento al dizionario in cui questa è contenuta. Impostiamo la key del nuovo elemento a “URL Schemes”.
- Espandiamo la struttura che è stata creata e impostiamo il valore dell’elemento 0 alla stringa “myapp” (o un’altra stringa sempre a nostra scelta).
Fatto, nient’altro! Abbiamo il nostro URL Scheme disponibile e pronto per essere utilizzato. Se avete seguito correttamente l’operazione dovreste avere come risultato qualcosa del genere:

Costruiamo ora il nostro URL secondo lo schema [URL Scheme]://[URL identifier]. Se avete inserito le stringhe suggerite nel tutorial, il risultato ottenuto sarà l’indirizzo myapp://path. Facciamo una prova e vediamo se funziona.
Clicchiamo su “Build & Run” in XCode e, una volta che la nostra app si è aperta, apriamo Safari nell’iPhone Simulator (o nel dispositivo) e proviamo a digitare l’indirizzo myapp://path. Vedrete che si chiuderà safari e darà spazio nuovamente alla nostra app che si aprirà senza problemi.
Quanto mostrato fin’ora è più che sufficiente per far semplicemente aprire la nostra applicazione da un browser per iOS o, chiamando la funzione openURL, da un’altra applicazione. Ma se volessimo aggiungere delle funzionalità alla nostra app quando questa viene aperta?
Come dicevamo all’inizio di questo articolo, Apple mette a disposizione degli sviluppatori un semplice metodo booleano che di default restituisce “NO” e non fa fare nulla di che alla nostra app, se non aprirsi semplicemente. Se volessimo farle fare qualcosa dovremmo, innanzitutto, restituire “YES” e inserire le istruzioni da eseguire prima della chiamata a “return”.
Dobbiamo dunque sovrascrivere la funzione “handleOpenURL”.
Andiamo nel delegato della nostra app e aggiungiamo questo metodo:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
// Inserisci qui le istruzioni da eseguire
return YES;
}
A questo punto non ci resta che indicare le istruzioni da eseguire quando l’app si aprirà. Un modo comune di fare ciò è sfruttare la parte query dell’indirizzo. Questo è di solito del tipo “query=something” (ma può essere anche semplicemente “query“) e si scrive dopo l’URL identifier da cui è diviso dal segno “?”.
Un esempio pratico potrebbe essere questo:
myapp://path?query=something o ancora “myapp://path?query“.
Cocoa ci permette di estrapolare semplicemente la parte query dall’indirizzo tramite il metodo [url query]. Aggiungiamo, quindi, qualche semplice istruzione al nostro metodo handleOpenURL:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
if ([url query] != nil) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"[url query] è diverso da nil" message:nil delegate:self cancelButtonTitle:@"Continua" otherButtonTitles:nil];
;
;
return YES;
}
return NO;
}
Quando l’app viene aperta tramite URL Scheme, ora, controlla se la parte query dell’indirizzo chiamante esiste (indipendentemente dal fatto che sia del tipo query o query=something) e in caso esista mostra una UIAlertView.
Clicchiamo nuovamente su “Build & Run” in XCode e proviamo se tutto funziona. Apriamo Safari e digitiamo l’indirizzo senza query. L’app si aprirà e non farà nulla. Ripetiamo l’operazione aggiungendo questa volta una query (es. myapp://path?query) e l’app mostrerà l’UIAlertView come previsto:

Ovviamente, questo è solo un banale esempio, le cose che si possono fare all’apertura dell’app sono limitate alla sola nostra fantasia! 😀
Un altro uso interessante per gli URL Scheme: “Collezionale tutte!”
A dimostrazione degli svariati usi che si possono fare degli URL Schemes, uno in particolare ha colpito molti sviluppatori: aggiungere una lista di tutte le applicazioni create nell’about di ogni vostra app e usare gli URL Schemes per capire quali, tra le nostre app, l’utente ha installato sul proprio device e incitarlo, eventualmente, ad acquistare le altre!
Probabilmente, i primi a usare gli URL Schemes in questo modo sono stati gli sviluppatori di Tweetbot. Nella loro app li usano così:

Per sapere se un’applicazione è installata sul dispositivo in uso o meno, ci basterà inserire il codice che segue:
BOOL isMyAppInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL urlWithString:@"myapp://path"];
if (isMyAppInstalled) {
// do something cool here
}
Semplice, no? 😉
Integrare altre applicazioni nella nostra app
Qui potete trovare una lista parziale, ma comunque abbastanza vasta, di applicazioni per iOS che utilizzano gli URL Scheme. Allora che aspettate? Aggiungete il vostro schema e integrate la vostra app con quelle di altri sviluppatori e fate in modo che altri facciano lo stesso con la vostra!
Conclusioni
A questo proposito, voglio approfittare dell’occasione per accennarvi un piccolo progetto che sto intraprendendo: sto sviluppando un Kit simile a quello proposto dagli sviluppatori di ShareKit (kit per l’integrazione di servizi come Twitter, Facebook, Instapaper e Read it Later), ma che serva per integrare applicazioni di vario genere nelle nostre app. Spesso, infatti, le applicazioni che utilizzano gli URL Schemes non lo fanno solo per poter far aprire la propria app dall’esterno, ma utilizzano anche le funzioni di query e fragment per aggiungere funzionalità. Solo che non è così facile trovare tutti gli schemi di una data app se non contattando direttamente gli sviluppatori e a volte ci sono anche delle eccezioni da considerare che possono essere non proprio palesi. Questo per non parlare del fatto che per ogni app che integriamo dobbiamo scrivere del codice che si occupi di avvisare l’utente quando quell’app non è installata sul dispositivo e permetta all’utente di andarla a scaricare direttamente dallo store. Certo, il sito HandleOpenURL.com ci da una mano, ma si può fare di meglio!
Il mio obiettivo è quello di facilitare tutta la serie di operazioni necessarie a integrare una data app nella nostra scrivendo solo una o due righe di codice.
Se siete interessati a questo progetto e volete saperne di più potete iscrivervi alla mailing list che ho creato appositamente qui e/o visitare il sito Sketch to Code (in allestimento).
Se volete contribuire fornendo i vostri schemi potete invece scrivermi via e-mail. Per contribuire direttamente al progetto, invece, iscrivetevi alla mailing list, presto caricherò il progetto su GitHub e quando questo avverrà potrete modificare il codice direttamente o inviarmi le vostre classi per la revisione e l’inserimento nel kit. 🙂
Alla prossima
Se avete problemi con il tutorial, questo è il nostro file di progetto.









10 Responses to “T#095 – Creare URL Schemes personalizzati per le nostre applicazioni iPhone e iPad”
14 Giugno 2011
LucaCiao, molto interessante il tuo articolo! Sarei però interessato ad un piccolo approfondimento per la parte di collezionale tutte.. come si fga a generare un view come quella dell’esempio dove hai le applicazioni proprie (installate o meno)???
14 Giugno 2011
GianlucaN.B. avevo già postato una risposta simile in risposta al tuo commento ma non sembra essere stato pubblicato, quindi lo riscrivo:
Devi creare una nuova subview di tipo UIView per la vista in cui vuoi inserire il “Get Them All!”. All’interno di questa vista poi inserirai qualcosa riguardo le tue app (es. le icone delle tue app) e un modo per far capire all’utente quali sono quelle installate sulla device.
È una cosa molto semplice da fare, non avrai problemi 😉
15 Giugno 2011
LucaSalve, il tutorial è fantastico. Ma mi sono domandato come posso fare per aprire un file dalla bundle della mia app con una determinata app? Per esempio, un file .pages da aprire con pages per ipad?
26 Giugno 2011
Gianluca T.Dai uno sguardo a questo esempio: DocInteraction 😉
2 Luglio 2011
daniela20 Luglio 2011
libreraCiao, complimenti per l’articolo molto ben fatto. Volevo chiedere se utilizzando gli URL Schemes personalizzati c’è la possibilità, da parte dell’app chiamata, di rifiutare la richiesta di apertura, restituendo il controllo all’app chiamante.
Grazie mille
20 Luglio 2011
Gianluca TranchedoneChe io sappia no!
22 Dicembre 2011
EmilioSalve a tutti,
Avrei 2 quesiti da fare, riguardanti l’iphone, il primo e’ se esiste un app da programmare su Iphone , la quale ad una determinata data e ora apra un app o esegua un URL da me inserito.
La seconda domanda riguarda il fatto dei comandi URL su Iphone, da quello che ho visto digitando il giusto comando , da safari posso aprire qualsiasi cosa…. Come faccio a sapere tutti gli URL? Esempio airplane mode/on e off, dati 3G on o off… E cosi’ via… Grazie in anticipo,
La mia mail e’ emilio.palmucci@gmail.com
13 Agosto 2012
MarcoCiao bellissimo articolo e anche molto interessante ora volevo sapere questo: sto sviluppando un applicazione che premendo su una determinata riga della tabella parte la chiamata , siccome sono più numeri di telefono come faccio a far partire la chiamata con un numero sempre diverso corrispondente alla cella che viene premuta nella tabella Xk il codice [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@”tel://12345″]] fa partire la chiamata logicamente al numero 12345 per implementare altri numeri no solo un singolo numero come si può fare ? Grazie
11 Settembre 2012
PinoOttimo tutorial 🙂 Complimenti. Non riesco a trovare NSURL per lanciare dalla mia app per Ipad Ical. Come posso fare per eseguire iCal dalla mia app ?
Grazie.