• Programmazione Android
  • CORSI ONLINE
  • Web Agency

Logo

Corsi di programmazione web e mobile online
Navigation
  • Home
  • CORSI ONLINE
  • Tutorial Pratici
  • GUIDE COMPLETE
    • Corso completo di C
    • Corso videogame con Cocos2d
    • Programmazione Cocoa Touch
  • Sezioni
    • Libri e manuali
    • Tips & Tricks
    • Risorse utili
    • Strumenti di Sviluppo
    • Materiale OpenSource
    • Framework
    • Guide Teoriche
    • Guide varie
    • Grafica e Design
    • iPad
    • News
    • Video Tutorial
    • Windows Phone
  • Pubblicità
  • About
    • Chi siamo
    • Pubblicazioni
    • Collabora
    • Sostieni devAPP

T#095 – Creare URL Schemes personalizzati per le nostre applicazioni iPhone e iPad

By Gianluca Tranchedone | on 13 Giugno 2011 | 10 Comments
Senza categoria

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:

  1. 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);
  2. 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;
  3. 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:

  1. 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”.
  2. Selezioniamo quindi la riga appena creata e impostiamone la key a “URL types”.
  3. 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).
  4. 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”.
  5. 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.

Share this story:
  • tweet

Tags: esempi codice XCodeopenURLsharedApplicationTutorial PraticiURL Scheme iPhoneURL Schemes

Recent Posts

  • Parte il percorso programmatori iOS in Swift su devACADEMY.it

    20 Dicembre 2017 - 0 Comment
  • Android, crittografare dati velocemente con Encryption

    24 Settembre 2018 - 0 Comment
  • Sql2o, accesso immediato ai database tramite Java

    3 Settembre 2018 - 0 Comment
  • Okio, libreria per ottimizzare l’input/output in Java

    27 Agosto 2018 - 0 Comment

Related Posts

  • L#020 – Far comunicare oggetti diversi in Objective-C: quale metodo scegliere?

    3 Novembre 2011 - 5 Comments
  • MobileBricks: il primo store di componenti commerciali supportati per sviluppatori iPhone e iPad

    22 Giugno 2011 - 3 Comments
  • T#045 – Visualizziamo i video di YouTube inApp

    25 Maggio 2010 - 4 Comments

Author Description

Gianluca lavora come iOS Developer presso una nota azienda Nederlandese. Nonostante si sia laureato in Lingue Culture Comparate (Giapponese e Anglo-Americana) presso l'Università degli Studi di Napoli “L'Orientale”, la passione per la programmazione risale all'età della fanciullezza in cui aveva imparato i rudimenti del C++. L'interesse per questa materia è però andato oltre questa base solo dalla fine del 2009, quando si è avvicinato alla programmazione per iPhone. A Settembre 2010 ha comprato il suo primo Mac (finalmente) e ha iniziato a programmare la sua prima app per iPhone, “Japanese Grammar Dictionary: Basic”, disponibile da metà Gennaio 2011 su App Store. Nel Luglio dello stesso anno, la sua seconda applicazione, “Chi Paga da Bere?”, è stata pubblicata sull'App Store.

10 Responses to “T#095 – Creare URL Schemes personalizzati per le nostre applicazioni iPhone e iPad”

  1. 14 Giugno 2011

    Luca

    Ciao, 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)???

  2. 14 Giugno 2011

    Gianluca


    Luca:

    Ciao, 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)???

    N.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 😉

  3. 15 Giugno 2011

    Luca

    Salve, 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?

  4. 26 Giugno 2011

    Gianluca T.


    Luca:

    Salve, 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?

    Dai uno sguardo a questo esempio: DocInteraction 😉

  5. 2 Luglio 2011

    daniela


    Gianluca:


    Luca:

    Ciao , io vorrei mettere una view della serie “Collezionale tutte”, all’interno di ogni app, con la possibilià di tappare sull’icona dell’app e andare direttamente in itunes per scaricarla.
    MI sembra, da ciò che dici, che è una cosa semplice, ma non riesco a capire bene il meccanismo….
    Non riusciresti a fare un tutorial di esempio ?

    Grazie Ciao Daniela
    Ciao, 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)???

    N.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

  6. 20 Luglio 2011

    librera

    Ciao, 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

  7. 20 Luglio 2011

    Gianluca Tranchedone

    Che io sappia no!

  8. 22 Dicembre 2011

    Emilio

    Salve 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

  9. 13 Agosto 2012

    Marco

    Ciao 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

  10. 11 Settembre 2012

    Pino

    Ottimo 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.

Leave a Reply

Your email address will not be published. Required fields are marked *


*
*

Corso online di programmazione android e java

SEZIONI

  • Android
  • Comunicazioni
  • Contest
  • Corsi ed Eventi
  • Corso completo di C
  • Corso programmazione videogiochi
  • Framework
  • Grafica e Design
  • Guida rapida alla programmazione Cocoa Touch
  • Guide Teoriche
  • Guide varie
  • iPad
  • Le nostre applicazioni
  • Libri e manuali
  • Materiale OpenSource
  • News
  • Pillole di C++
  • Progetti completi
  • Risorse utili
  • Strumenti di Sviluppo
  • Swift
  • Tips & Tricks
  • Tutorial Pratici
  • Video Tutorial
  • Windows Phone

Siti Amici

  • Adrirobot
  • Allmobileworld
  • Apple Notizie
  • Apple Tribù
  • Avvocato360
  • Blog informatico 360°
  • bubi devs
  • fotogriPhone
  • GiovaTech
  • iApp-Mac
  • iOS Developer Program
  • iPodMania
  • MelaRumors
  • Meritocracy
  • SoloTablet
  • TecnoUser
  • Privacy & Cookie Policy
©2009-2018 devAPP - All Rights Reserved | Contattaci
devAPP.it è un progetto di DEVAPP S.R.L. - Web & Mobile Agency di Torino
Str. Volpiano, 54 - 10040 Leini (TO) - C.F. e P.IVA 11263180017 - REA TO1199665 - Cap. Soc. € 10.000,00 i.v.

devACADEMY.it

Vuoi imparare a programmare?

Iscriviti e accedi a TUTTI i corsi con un’unica iscrizione.
Oltre 70 corsi e migliaia di videolezioni online e in italiano a tua disposizione.

ISCRIVITI SUBITO