2015-04-30 15 views
9

Non riesco a capire come passare a Safari da un'app nativa in iOS 7+. Ho usato UIApplication.sharedApplication.openURL(), ma questo apre una nuova scheda. Vorrei restituire l'utente alla pagina corrente che stava visualizzando prima senza aprire una nuova scheda. Ho trovato il post this SO, ma ha qualche anno, quindi speravo che le cose fossero cambiate da allora.iOS - Torna a Safari dall'app nativa senza aprire la nuova scheda

Ecco il flusso di lavoro che sto immaginando: rubinetti

  1. utente su un link in una pagina HTML in Safari per aprire/installare la mia app
  2. utente esegue un'azione sul mio app
  3. Dopo la l'utente ha finito di eseguire l'azione, la mia app si apre automaticamente, e l'utente torna sulla pagina da cui è stato interrotto

Google ha in qualche modo fatto questo con la loro app Google Maps. Se cerchi un indirizzo su google.com su Safari, puoi toccare la mappa visualizzata nei risultati di ricerca e aprirà l'app Maps. Nella parte superiore dell'app Maps sarà presente una barra "Torna a Safari" che puoi toccare. Dopo averlo toccato, si ritorna a Safari senza caricare un'altra scheda. Non riesco a trovare nulla riguardo a come Google ha fatto questo. Se riesco a replicare questo comportamento nella mia app, funzionerebbe perfettamente.

Qualsiasi aiuto sarebbe molto apprezzato!

+0

Si prega di vedere la mia risposta e il progetto Github. –

risposta

7

Esiste un modo per ottenere ciò che si desidera utilizzando le API iOS standard. Non è necessario utilizzare componenti esterni.

Sei tu a controllare la tua pagina web e la tua app, così sai l'URL esatto che ha il link alla tua app.

Questi sono i passi:

1) Nella vostra applicazione, definire uno schema URL personalizzato. In questo caso supponiamo che tu usi lo schema myawesomeapp://. Puoi farlo nel tuo progetto Xcode andando nella sezione Info del tuo obiettivo. Vedi sotto

Defining a custom URL scheme

2) Nella pagina web è necessario per gestire i due scenari: app installata/non installato. Si tratta solo di rilevare se un'app risponde allo schema myawesomeapp://.

Per rilevare dalla tua pagina web se la vostra applicazione non è installato si rimanda al this post

spiegherò il caso in cui è già installato l'applicazione.

Diciamo che la pagina web che contiene il link è:

http://www.mywebsite.com/mypage.html#mytag

il collegamento fornito nella tua pagina web dovrebbe passare alcuni parametri per l'applicazione e uno di questi dovrebbe essere l'URL che si desidera che l'applicazione ritornare. Seguendo con l'esempio il collegamento potrebbe essere:

myawesomeapp://?action=my_action_1&sourceurl=http%3A%2F%2Fwww.mywebsite.com%2Fmypage.html%23mytag

Nota che l'URL si passa come un parametro all'interno del regime deve essere URL encoded o non funzionerà correttamente.

3) Nella tua app delegato è necessario implementare il metodo:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

In questo metodo, analizzare l'URL, decodificare le voci di query e passare il SourceURL al controller della vista responsabile di gestire il azione prima di chiamarla. In questo caso imposto una proprietà pubblica nel ViewController che memorizzerà l'URL.

@property (nonatomic, strong) NSURL *sourceURL;

4) Nel regolatore di vista quando l'utente termina l'interazione, basta chiamare:

[[UIApplication sharedApplication] openURL:self.sourceURL];

Perché self.sourceURL contiene l'URL della tua pagina web, Safari sarà lanciato con il URL. Tuttavia, poiché quella pagina è già aperta, iOS lo rileva e riapre quella pagina.

Ho un progetto di esempio nel mio Github page che implementa tutto questo.

E per finalizzare, dopo aver installato il progetto di esempio nel vostro iPhone, aprire questo post overflow dello stack da Safari Mobile e open my awesome app

volta che l'applicazione è aperta, fare clic sul pulsante e si ritorna a questo overflow dello stack inviare.

+2

Wow, grazie per l'incredibile e completa risposta !! Daremo un'altra occhiata a questa risposta e provatela martedì! – Alexander

+0

@Alexander fammi sapere se hai bisogno di aiuto con il progetto Github. –

+1

Fantastico, l'ho fatto funzionare! Grazie mille per la tua risposta dettagliata e il codice di esempio! C'è un modo per impedire a Safari di ricaricare la pagina dopo aver aperto la scheda esistente? – Alexander

1

Il comportamento che hai descritto è esattamente ciò per cui è stato progettato lo FB's AppLinks, e avrai lo stesso comportamento con tutte le app iOS che lo supportano (che è parecchio) fuori dagli schemi!

Tra l'altro Google Maps utilizza lo stesso componente: lo puoi vedere se apri Google Maps da diciamo Fantastical.app! enter image description here

Problemi correlati