web-dev-qa-db-fra.com

Lancement de l'application OR app store depuis Safari?

Je sais déjà comment lancer une application depuis safari, mais est-il possible de vérifier si l'application est installée avant de lancer? Je pense lancer l'App Store si l'application n'est pas actuellement installée sur l'iPhone.

46
ninjaneer

Il n'est pas possible de vérifier si l'application est installée à partir d'une page Web. Vous pouvez le faire dans une autre application en vérifiant si votre schéma d'URL peut être ouvert à l'aide de la méthode -canOpenURL: d'UIApplication, mais il n'y a pas d'équivalent javascript pour cela.

Cependant, vous pouvez utiliser la solution de contournement suivante:

<script language="javascript">
    function open_appstore() {
        window.location='http://iTunes.com/';
    }

    function try_to_open_app() {
        setTimeout('open_appstore()', 300);
    }
</script>

<a onClick="javascript:try_to_open_app();" href="yourappurl:">App name</a>

Ce code définira un délai d'expiration sur le lien qui appellera la fonction open_appstore si ce délai se termine. Étant donné que votre lien pointe vers l'URL personnalisée de l'application, Safari essaiera d'ouvrir ce lien et s'il le peut, il ouvrira l'application et arrêtera le chronomètre, donc le lien AppStore ne sera pas ouvert.

Si le lien de l'application ne peut pas être ouvert, lorsque le minuteur est épuisé, il affichera une fenêtre d'erreur indiquant qu'il ne peut pas ouvrir la page (ne peut pas s'en débarrasser), mais il ira immédiatement à l'AppStore et rejettera cette erreur.


iOS 9 ajoute une fonctionnalité vraiment sympa qui permet à votre application d'ouvrir une URL http/s: niversal Links


Dans iOS 10 , une fenêtre contextuelle indique " Ouvrir dans [Nom de l'application]" lorsque vous appuyez sur le lien et sur l'application est installée. Si l'utilisateur n'appuie pas sur " Ouvrir" dans le timeout donné, cette solution utilisera le repli. Comme 300 ms est trop court pour toucher quoi que ce soit, cette solution échoue toujours sur iOS 10 .

84
Filip Radelic

Cela a fonctionné pour moi dans une situation similaire: je voulais ouvrir l'application gmaps si elle était prise en charge - sinon, allez directement sur le site gmap.

function mapLink(addy) {     
  addy = encodeURIComponent(addy);

  var fallback = 'http://maps.google.com/?q=' + addy
  , link = 'comgooglemaps://?q=' + addy;

  try {
    document.location = link;
  } catch(err) {
    document.location = fallback;
  }
}

Semble fonctionner assez bien pour mon cas d'utilisation.

pdate: Si vous voulez faire une nouvelle fenêtre sur le repli, cela a quand même permis au message d'erreur ios de s'afficher. Pour le contourner, essayez ceci.

  try {
    document.location = link;
  } catch(err) {
    window.location.reload(true);
    window.open(fallback, '_blank');
  }
12
William Hall

La solution d'Apple:

Depuis Apple Documentation

https://developer.Apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html

Si l'application est déjà installée sur l'appareil d'un utilisateur, la bannière modifie intelligemment son action, et en appuyant sur la bannière, vous ouvrirez simplement l'application. Si l'utilisateur n'a pas votre application sur son appareil, appuyez sur la bannière pour le diriger vers l'entrée de l'application dans l'App Store. Lorsqu'il revient sur votre site Web, une barre de progression apparaît dans la bannière, indiquant combien de temps le téléchargement prendra. Une fois le téléchargement de l'application terminé, le bouton Afficher se transforme en bouton Ouvrir et le fait d'appuyer sur la bannière ouvrira l'application tout en préservant le contexte de l'utilisateur de votre site Web.

Les bannières d'application intelligentes déterminent automatiquement si l'application est prise en charge sur l'appareil de l'utilisateur. Si l'appareil chargé la bannière ne prend pas en charge votre application, ou si votre application n'est pas disponible à l'emplacement de l'utilisateur, la bannière ne s'affichera pas.

Pour ajouter une bannière d'application intelligente à notre page Web, incluez la balise Meta suivante dans l'en-tête de chaque page où vous souhaitez que la bannière apparaisse:

REMARQUE: Nous pouvons également passer l'argument app: comme myName, etc.,

Vérifiez que fournir un contexte de navigation à l'en-tête de votre application dans cette page

Mises à jour:

1. Une fois que vous avez fermé la bannière qui s'affiche, cela ne s'affichera plus, même si vous aviez cette balise Meta dans notre html.

2. Pour réinitialiser ce lancement de l'application, accédez à Général> Renvoyer> Réinitialiser tous les paramètres

Vous pouvez simplement lire la valeur de retour de la méthode - (BOOL) openURL: (NSURL) url *, si c'est NON, cela signifie que l'application cible n'est pas installée. Le code suivant coupé donne un exemple en utilisant le schéma d'URL de navigation:

NSString *stringURL = @"navigon://coordinate/NaviCard/19.084443/47.573305";
NSURL *url = [NSURL URLWithString:stringURL];
if([[UIApplication sharedApplication] openURL:url]) {
    NSLog(@"Well done!");
} else {
    stringURL = @"https://iTunes.Apple.com/it/app/id320279293?mt=8";
    url = [NSURL URLWithString:stringURL];
    [[UIApplication sharedApplication] openURL:url];
}

Merci à zszen pour la correction.

2
Zeb