2012-12-27 21 views
36

So che è possibile collegarsi direttamente a un'app in iOS registrando uno schema personalizzato (ad esempio: //) ed è anche possibile collegarsi all'app nell'appstore tramite itunes.Reindirizzare l'applicazione se installata, altrimenti su App Store

In molti casi, il flusso ideale è quello di fornire un collegamento che reindirizzi all'app se è installato e al negozio se non. È possibile, e se sì, come?

Aggiunto per chiarezza, lo scenario è che sto aprendo un collegamento (http) da una e-mail sul mio iphone che mi sta invitando a far parte di un gruppo in un'applicazione. Se l'utente ha l'app installata su quel dispositivo dovrebbe aprirsi, altrimenti il ​​link http dovrebbe reindirizzare a itunes.

+1

credo che la soluzione ideale sarebbe dire che si potrebbe reindirizzare a un link iTunes con un'istruzione . Qualcosa come: https://itunes.apple.com/us/app/clear/id492134154?mt=8&uo=4&open=true dove open = true dice all'app store ios di aprire l'app ... – ConfusedNoob

risposta

22

Non c'è modo di verificare questo. Tuttavia, c'è un bel trucco.

l'idea è fondamentalmente questo:

  1. La prima volta che si apre la vostra applicazione, si apre Safari Mobile dall'interno dell'app a un URL predefinito sul server
  2. Su tale URL si imposta una cookie, come appInstallato per gli utenti mobile safari
  3. Quindi restituisci l'utente alla tua app con il tuo schema registrato (come FB fa con SSO)
  4. Tutti i tuoi link di posta elettronica puntano al tuo sito web, ma sul sito web tu controlla se il browser è mobile Safari e se l'appInsta esiste il cookie lolly
  5. Se il browser non è mobile Safari o il cookie non viene trovato, si reindirizza all'AppStore o rimane nella pagina Web.
  6. Se le condizioni di 4 # sono vere, si reindirizzare l'utente alla tua app con lo schema registrato
  7. Se l'applicazione è stata eliminata da parte dell'utente, in modo che il sistema di URL personalizzato fallisce, si dispone di un reindirizzamento fail-safe al AppStore

I 2 ultimi passi sono spiegati on this SO post

+1

Nota nel primo passaggio ho provato a sostituire Safari con una webview dell'applicazione interna e non ha funzionato perché non condividono lo stesso cookie store. – Federico

+0

Sfortunatamente questo richiede un aggiornamento per il client ios. – BananaNeil

+0

Questo non funzionerà quando l'utente cancella i dati del sito web dalle impostazioni – Nishad

7

Sì, è piuttosto facile. Ciò richiede l'applicazione che si desidera aprire per avere uno schema URL dichiarato nel plist:

//if you can open your app 
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"yourapp://"]]) 
{ 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"yourapp://"]]; 
} 
else 
{ 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"ituneappstorelink"]]; 
} 
+0

Scusa, forse il mio scenario non era chiaro - questo presuppone che mi stia aprendo da un'altra app. In questo caso, si tratterà di un'e-mail o di un SMS tramite un collegamento Web http, pertanto il server Web remoto dovrà reindirizzare al collegamento appropriato. – ConfusedNoob

+0

Potrebbe essere necessario creare un collegamento a una pagina Web che tenta di aprire l'app nello stesso modo tramite Javascript e, se non lo apre, reindirizza al collegamento iTunes. Non ne ho la fonte, ma può funzionare. – rooster117

32

Penso che la risposta più semplice sarebbe quella di impostare una pagina sul vostro server con il seguente javascript:

(function() { 
    var app = { 
    launchApp: function() { 
     window.location.replace("myapp://"); 
     this.timer = setTimeout(this.openWebApp, 1000); 
    }, 

    openWebApp: function() { 
     window.location.replace("http://itunesstorelink/"); 
    } 
    }; 

    app.launchApp(); 
})(); 

Questo in pratica tenta di reindirizzare alla tua app e imposta un timeout per reindirizzare all'app store se fallisce.

Si potrebbe persino rendere il codice un po 'più intelligente e controllare l'agente utente per vedere se sono un utente ios, un utente Android o un utente Web e quindi reindirli in modo appropriato.

+2

Questo dovrebbe essere considerato per il risposta accettata – user

+3

iOS lancia un messaggio piuttosto ostile, "Safari non può aprire la pagina perché l'indirizzo non è valido" se l'app non è installata con questo metodo. –

+1

@RealWorld Sembra una nuova aggiunta a iOS 11. In questi giorni, per questo argomento, consiglierei di implementare il collegamento universale. Potrebbe valere la pena di scrivere una nuova risposta a questa domanda spiegando come funziona. – BananaNeil

13

Se si dispone di una pagina web si collega a dall'e-mail con la pagina web contenente un iframe con il src impostato lo schema personalizzato per la tua App, iOS reindirizzerà automaticamente a quella posizione in App. Se l'app non è installata, non accadrà nulla. Ciò ti consente di collegarti in profondità all'App se è installato, o di reindirizzare all'App Store se non è installato.

Ad esempio, se è stata installata l'app di Twitter e si passa a una pagina Web contenente il seguente codice, verrebbe immediatamente indirizzato all'app. Se non hai installato l'app di Twitter, visualizzerai il testo "L'app di Twitter non è installata".

<!DOCTYPE html> 
<html> 
    <head> 
    <title>iOS Automatic Deep Linking</title> 
    </head> 
    <body> 
     <iframe src="twitter://" width="0" height="0"></iframe> 
     <p>The Twitter App is not installed</p> 
    </body> 
</html> 

Ecco un esempio più completo che reindirizza al App Store se l'App non è installato:

<!DOCTYPE html> 
<html> 
    <head> 
    <title>iOS Automatic Deep Linking</title> 
    <script src='//code.jquery.com/jquery-1.11.2.min.js'></script> 
    <script src='//mobileesp.googlecode.com/svn/JavaScript/mdetect.js'></script> 
    <script> 
     (function ($, MobileEsp) { 
     // On document ready, redirect to the App on the App store. 
     $(function() { 
      if (typeof MobileEsp.DetectIos !== 'undefined' && MobileEsp.DetectIos()) { 
      // Add an iframe to twitter://, and then an iframe for the app store 
      // link. If the first fails to redirect to the Twitter app, the 
      // second will redirect to the app on the App Store. We use jQuery 
      // to add this after the document is fully loaded, so if the user 
      // comes back to the browser, they see the content they expect. 
      $('body').append('<iframe class="twitter-detect" src="twitter://" />') 
       .append('<iframe class="twitter-detect" src="itms-apps://itunes.com/apps/twitter" />'); 
      } 
     }); 
     })(jQuery, MobileEsp); 
    </script> 
    <style type="text/css"> 
     .twitter-detect { 
     display: none; 
     } 
    </style> 
    </head> 
    <body> 
    <p>Website content.</p> 
    </body> 
</html> 
+0

Per la cronaca, questo è ciò che stiamo facendo su Syfy.com. Vai a http://www.syfy.com/live per vedere il sito automaticamente collegarti in profondità all'app se la hai installata. – q0rban

+0

Questa è la risposta corretta alla domanda. Invece di rilevare iOS nella pagina stessa, controllo l'intestazione user-agent nella richiesta get e servo la pagina di reindirizzamento o una pagina con la richiesta all'utente di aprire il collegamento in un dispositivo iOS. Per curiosità, come sapevi che iframe si sarebbe comportata in questo modo? Impossibile trovare questo nella documentazione html iframe. –

+1

Grazie @CarlosGuzman! Non sapevo che avrebbe funzionato in questo modo, ho continuato a provare cose diverse finché non ha funzionato! :) – q0rban