web-dev-qa-db-fra.com

iOS9: Essayez si possible d'ouvrir l'application via un système ou redirigez-vous vers l'App Store sinon

Ma question concerne iOS9 uniquement!

J'ai une page de destination HTML et j'essaie de rediriger l'utilisateur vers mon application via un schéma d'URL si l'application est installée, ou redirection vers l'Appstore sinon.

Mon code est:

document.addEventListener("DOMContentLoaded", function(event) {

  var body = document.getElementsByTagName('body')[0];
  body.onclick = function () {
    openApp();
  };
});

var timeout;

function preventPopup() {

    clearTimeout(timeout);
    timeout = null;
    window.removeEventListener('pagehide', preventPopup);
}

function openApp(appInstanceId, platform) {

  window.addEventListener('pagehide', preventPopup);
  document.addEventListener('pagehide', preventPopup);

  // create iframe
  var iframe = document.createElement("iframe");
  document.body.appendChild(iframe);
  iframe.setAttribute("style", "display:none;");
  iframe.src = 'myscheme://launch?var=val';

  var timeoutTime = 1000;
  timeout = setTimeout(function () {

    document.location = 'https://iTunes.Apple.com/app/my-app';

  }, timeoutTime);
}

Le problème est que l'astuce iframe ne fonctionne pas dans SafariiOS9.

Une idée pourquoi?

Mon astuce iframe basée sur la réponse this .

39
gran33

L’astuce iframe ne fonctionne plus - j’imagine que Apple sait que cela encouragera davantage de développeurs à mettre en œuvre les liens universels plus rapidement.

Vous pouvez toujours définir window.location='your-uri-scheme://'; et retour à l’App Store après 500 ms. Si vous utilisez cette approche, il y a une "danse" entre les fenêtres contextuelles, comme nous le faisons à Branch (nous le faisons en cas de repli si les liens universels ne fonctionnent pas).

window.location = 'your-uri-scheme://'; // will result in error message if app not installed
setTimeout(function() {
   // Link to the App Store should go here -- only fires if deep link fails                
   window.location = "https://iTunes.Apple.com/us/app/myapp/id123456789?ls=1&mt=8";
}, 500);

J'aimerais avoir une meilleure réponse pour vous. iOS 9 est nettement plus limité.

Pour un aperçu utile de ce qui est nécessaire pour les liens universels si vous choisissez cette voie, consultez ma réponse ici ou lisez ce tutoriel

23
st.derrick

Comme déjà mentionné, le réglage window.location sur iOS 9 fonctionne toujours. Cependant, cela ouvre une boîte de dialogue Ouvrir dans l'application. J'ai mis un exemple sur https://bartt.me/openapp que:

  1. Lance Twitter lorsque vous cliquez sur Ouvrir dans l'application Twitter .
  2. Retombe à l'application Twitter dans l'App Store.
  3. Redirige vers Twitter ou vers l'App Store sans l'utilisateur sélectionnant Ouvrir dans le Ouvrir dans la boîte de dialogue App .
  4. Fonctionne dans tous les navigateurs sur iOS et Android.

Regardez la source de https://lab.bartt.me/openapp pour plus d'informations.

2
Bart Teeuwisse

Peut-être essayez-vous de vous aider avec les liens universels

Idée: évitez les solutions personnalisées (JavaScript, iframe) dans Safari, remplacez votre code par un lien universel pris en charge.

Exemple

<html>
<head>
...
</head>
<body>
    <div class"app-banner-style">
        <a href="http://yourdomain.com">In app open</a> 
    </div>
...content
</body>
</html>

si votre application prend en charge les liens universels (par exemple, votredomaine.com), vous devez configurer votre domaine (et votre chemin) et iOS9 doit réagir à ce lien en ouvrant votre application. Ce n'est que théorie , mais je suppose que cela devrait être du travail :)

https://developer.Apple.com/library/prerelease/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//Apple_ref/doc/uid/TP40016308-CH12

1
carlos.baeza

le hack iframe ne fonctionne plus dans iOS 9. La solution possible consiste à utiliser deux boutons. Exemple:

$('#goToStoreBtn').text( "go to store" ).click(function(event){
    event.preventDefault();
    event.stopPropagation();
    window.location = storeUrl; // https://iTunes.Apple.com/...
});

$('#goToAppBtn').text( "go to app" ).click(function(event){
    event.preventDefault();
    event.stopPropagation();
    window.location = appUrl;  // myApp://...
});
0
xac