28 votes

Comment ouvrir Safari à partir d'une WebApp dans iOS 7

Dans les versions précédentes d'iOS, <a> ouvriraient Mobile Safari, et vous deviez les intercepter pour qu'elles restent plutôt dans la webapp (une page HTML qui a été enregistrée sur l'écran d'accueil par l'utilisateur).

À partir d'iOS 7, tous les liens restent à l'intérieur de la WebApp. Je n'arrive pas à trouver comment faire pour qu'elle ouvre Safari, alors que je le souhaite vraiment.

J'ai essayé d'utiliser window.open y a target="_blank" mais aucun des deux ne fonctionne.

En voici un exemple. https://s3.amazonaws.com/kaontest/testopen/index.html

Si vous l'enregistrez sur votre écran d'accueil dans iOS 6, le lien ouvre Safari. Mais dans iOS 7, ce n'est pas le cas.

Notez que c'est la question OPPOSÉE que tout le monde pose habituellement ("comment NE PAS ouvrir Safari"). Ce comportement semble être le nouveau comportement par défaut, et je n'arrive pas à trouver comment retrouver l'ancien comportement !

24voto

thomasfuchs Points 1528

Mise à jour 10/23/13 : Corrigé dans iOS 7.0.3. Ajoutez un attribut target="xxx" à vos liens pour faire cela. Fonctionne également avec mailto : et friends.

Il s'agit d'un bogue dans iOS 7.0, 7.0.1 et 7.0.2 et il n'existe aucun moyen connu de le faire.

Il s'agit d'une régression par rapport aux versions antérieures d'iOS, où les liens qui s'ouvrent dans Safari fonctionnent parfaitement. Il semble faire partie d'un ensemble de problèmes liés à l'ouverture d'URL, aucun schéma d'URL externe ne fonctionnant (par exemple, "mailto :" ne fonctionne pas non plus).

Les méthodes habituelles de contournement d'un tel problème ne fonctionnent malheureusement pas (par exemple, l'utilisation d'un formulaire et sa soumission avec une cible de "_new").

Il y a d'autres problèmes graves, comme les dialogues modaux d'alerte et de confirmation qui ne fonctionnent pas du tout.

Il mai aide à les soumettre à Apple en tant que bogues, http://bugreport.apple.com

6voto

R Porter Points 609

C'est un problème connu depuis les deux derniers mois de bêta. Il n'y a pas de solutions de contournement, et d'après ce que je peux dire, Apple n'a pas donné d'ETA sur les corrections, ni même sur la reconnaissance du bug. Des rapports de bogue ont été soumis, mais pas mis à jour/répondu.

Plus : http://www.mobilexweb.com/blog/safari-ios7-html5-problems-apis-review

6voto

Mitchell Simoens Points 566

Avoir une balise d'ancrage avec une cible _blank fonctionnera dans iOS 7.0.3 mais l'utilisation de window.open ne fonctionnera pas et restera ouvert dans le webview dans 7.0.3 :

window.open('http://www.google.com/', '_blank');

1voto

caktux Points 181

J'ai trouvé deux solutions pour l'instant à ce problème, les deux utilisant évidemment preventDefault sur les liens externes.

Si vous créez un lien vers un autre site Web ou vers quelque chose à télécharger, la seule option que je vois est d'avertir ironiquement l'utilisateur de maintenir son doigt sur le lien pour obtenir l'invite d'appel tactile. Ou encore, selon qu'il s'agit d'un site Web ou d'un PDF, lui demander de copier le lien ou, dans le cas d'un PDF, de l'ajouter à sa liste de lecture. Comme les modales d'alerte et de confirmation ne fonctionnent pas non plus, vous devrez mettre en place vos propres notifications modales. Si c'est déjà le cas, cela ne devrait pas poser trop de problèmes.

Mise à jour [2013-10-25] Apparemment, le problème a été corrigé dans iOS 7.0.3 et les liens s'ouvrent dans Safari...

Modifier [2013-10-05] Voici à peu près ce que j'utilise avec une modale jQuery UI.

// iOS 7 external link polyfill
$('a[rel=external], a[rel=blank], a[target=_blank], a[href$=".pdf"]').on('click', function(e) {

  if (navigator.standalone && /iP(hone|od|ad) OS 7/.test(navigator.userAgent)) {
    e.preventDefault(); e.stopPropagation();

    var href = $(this).attr('href');

    var $dialog = $('<div id="ios-copy"></div>')
      .html('<p>iOS 7 prevents us from opening external links in Safari, you can continue to the address and risk losing all navigation or you can copy the address to your clipboard by <strong>holding your finger on the link</strong> for a few seconds.</p><p><a style="background-color: rgba(0,0,0,.75); color: #fff; font-size: 1.25em; padding: 1em;" href="' + href + '">' + href + '</a></p>')
      .appendTo('body')
      .dialog({
        title: 'External link',
        modal: true,
        buttons: {
          Ok: function() {
            $( this ).dialog( "close" );
          }
        }
      });
  }
});

L'autre solution consiste à utiliser ajax ou une iframe pour charger le contenu externe, mais à moins que vous ne disposiez d'un bon sous-navigateur ou de quelque chose d'autre dans votre application, cela ne sera pas très convaincant. Voici quelque chose qui va dans ce sens.

// iOS 7 external link polyfill
if (/iP(hone|od|ad) OS 7/.test(navigator.userAgent) && window.navigator.standalone) {
  $('a[rel=external], a[href$=".pdf"]').on('click', function(e) {
    e.preventDefault(); e.stopPropagation();

    var link = this;
    var href = $(link).attr('href');

    var frameContainer = $('<div></div>').css({
      position: 'absolute',
      left: 10,
      top: $(link).position().top,
      opacity: 0,
      overflow: 'scroll',
      '-webkit-overflow-scrolling': 'touch',
      height: 520,
      transition: 'opacity .25s',
      width: 300
    });

    var iosFrame = $('<iframe class="iosFrame" seamless="seamless" width="1024" height="5000"></iframe>')
      .attr('src', href)
      .css({
        height: 5000,
        'max-width': 1024,
        width: 1024,
        overflow: 'scroll !important',
        '-webkit-overflow-scrolling': 'touch !important'
      });

    var iosFrameClose = $('<a href="#"><i class="icon-cancel icon-remove icon-3x"></i></a>').css({
      position: 'absolute',
      left: -10,
      top: $(link).position().top - 20,
      'text-shadow': '1px 1px 1px #000',
      transition: 'opacity .25s',
      opacity: 0,
      '-webkit-transform': 'translate3d(0, 0, 0)',
      width: '3em',
      height: '3em'
    }).on('click', function(e) {
      e.preventDefault();
      setTimeout( function() {
        $(frameContainer).remove();
        $(iosFrameClose).remove();
      }, 250);
    });

    iosFrame.appendTo(frameContainer);
    frameContainer.appendTo('body');
    iosFrameClose.appendTo('body');

    iosFrame.contents().css({
      '-webkit-transform': 'translate3d(0, 0, 0)'
    });

    // Show this thing
    setTimeout( function() {
      $(frameContainer).css({ opacity: 1 });
      $(iosFrameClose).css({ opacity: 1 });
    }, 1);
  });
}

1voto

JDubDev Points 166

MISE À JOUR Je voulais juste faire savoir à ceux qui suivent ce dossier que la version 7.0.3 d'iOS semble résoudre le problème. J'ai conservé des applications web autonomes pour les tester et la mise à jour publiée aujourd'hui a rétabli la fonctionnalité de lien externe/application. J'ai donc mis à jour mon code pour indiquer aux clients qu'ils doivent mettre à jour leur téléphone au lieu de supprimer et de réenregistrer l'application Web.


J'allais juste ajouter un commentaire mais apparemment c'est trop long.

Apple a ouvert la voie à un monde de WebApps en autorisant l'enregistrement des Webapps sans chrome sur l'écran d'accueil de l'appareil. Ce "bug" ressemble à un grand pas en arrière. Cela ne semble pas très Apple de laisser un tel bug dans une version finale. Du moins pas un qui, une fois qu'ils en ont pris connaissance, ne déclare pas publiquement qu'ils travaillent sur un correctif comme ils l'ont fait avec les contournements de l'écran de verrouillage. Je ne peux pas m'empêcher de penser que cela semble intentionnel, bien qu'il ne semble pas y avoir de raison claire pour cela.

Pour les développeurs confrontés à ce problème, la seule solution que j'ai pu trouver était de

1) Mettez la méta-tag apple-mobile-web-app-capable à "no" - cela évite aux futurs utilisateurs d'être confrontés à ce problème.

2) J'ai mis à jour le code de notre application web pour rechercher "standalone" et iOS version 7+. Lorsque les conditions sont remplies, je propose une fenêtre contextuelle qui indique le problème et ajoute un lien vers cette page. Je demande aux utilisateurs de me pardonner et je leur demande de copier le lien et de le coller dans Safari.

J'ai enveloppé le lien dans une balise edge to edge avec des sauts de ligne au-dessus et au-dessous pour faciliter le processus de copier-coller de l'URL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X