it-swarm.com.de

So öffnen Sie eine native iOS-App über eine Web-App

Zusammenfassung Ich habe eine App mit einem korrekt funktionierenden URL-Schema, die ich über eine auf dem Startbildschirm gespeicherte Web-App starten möchte, und die normalen JavaScript-Umleitungsmethoden scheinen nicht zu funktionieren.

Details Ich versuche, eine iOS-Web-App zu erstellen, die im Vollbildmodus über einen auf dem Startbildschirm gespeicherten Link geöffnet werden kann. Die Web-App muss eine bestimmte native App öffnen. Ich habe das URL-Schema bereits für die native App registriert und festgestellt, dass es ordnungsgemäß funktioniert. Ich kann die native App öffnen, indem Sie das Schema beispielsweise direkt in meine Safari-Adressleiste eingeben. Ich kann es auch aus anderen Anwendungen mit der +openURL:-Methode von UIApplication öffnen. Ich möchte es auch mit bestimmten Argumenten einer nativen Web-App öffnen, die zum Startbildschirm hinzugefügt werden kann.

Was ich versuche zu tun, ist JavaScript wie in der nativen App zu verwenden:

window.location = "myapp://myparam";

Wenn Sie diesen Code in der Web-App verwenden, erhalte ich die folgende Warnung:

Msgstr "Kann myWebAppName nicht öffnen - myWebAppName konnte nicht geöffnet werden. Die Fehlermeldung war" Diese URL kann nicht angezeigt werden ".".

Das gleiche Javascript funktioniert korrekt, wenn es in Safari ausgeführt wird. Ich bekomme dasselbe Ergebnis mit window.location.replace("myapp://myparam").

Das HTML für die Web-App lautet:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>untitled</title>
    <meta name="generator" content="TextMate http://macromates.com/">
    <meta name="author" content="Carl Veazey">
    <!-- Date: 2012-04-19 -->
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />
    <meta name="Apple-mobile-web-app-capable" content="yes" />
    <meta names="Apple-mobile-web-app-status-bar-style" content="black-translucent" />
</head>
<body>
    <script type="text/javascript" charset="utf-8">
        if (window.navigator.userAgent.indexOf('iPhone') != -1) {
            if (window.navigator.standalone == true) {
                window.location = "myapp://myparam";
            } else {
                document.write("please save this to your home screen");
        };} else {
                alert("Not iPhone!");
                document.location.href = 'please-open-from-an-iphone.html';
        };
    </script>
</body>
</html>

Was mache ich hier falsch? Ich bin mit Javascript und dem mobilen Web ziemlich unerfahren, daher vermute ich, dass mir etwas Offensichtliches fehlt.

28
Carl Veazey

Ihr Code funktioniert, wenn er sich in einer mobilen Safari befindet, NICHT aber an einem Lesezeichen auf dem iOS-Desktop. Ich habe es noch nie so probiert, aber das ist das Problem. Wenn ich gerade deine JS auf setze 

<script type="text/javascript" charset="utf-8"> 
window.location = "myapp://myparam";
</script>

Es funktioniert im Browser, aber wenn es mit einem Lesezeichen versehen ist, schlägt es fehl. Hat es vielleicht etwas damit zu tun, wie die URL geladen wird, wenn sie mit einem Lesezeichen versehen ist, da es kein Chrom gibt? Meine Vermutung ist, dass Apple keine gebuchten Markierungsseiten für den Zugriff auf lokale Apps möchte. Ich habe auch bemerkt, dass ich, wenn ich eine lokal gehostete Seite, die in der mobilen Safari funktioniert, mit einem Lesezeichen versehen ist, nicht über Lesezeichen laden kann. Es ist wirklich seltsam ....

Die beste Empfehlung, die ich für Sie habe, ist es, es zu machen 

<meta name="Apple-mobile-web-app-capable" />

anstatt 

<meta name="Apple-mobile-web-app-capable" content="yes" />

Auf diese Weise wird es auf dem Startbildschirm angezeigt, wird aber leider mit dem Chrom geladen. Das ist die einzige Lösung, die mir einfällt.

13
AJak

Wenn Sie eine iOS-Anwendung öffnen müssen, wenn sie installiert ist und die Funktionalität Ihrer Seite beibehalten möchten, hilft location.href = 'myapp://?params=...'; nicht, da myapp:// nicht registriert ist und die Weiterleitung zu einem nicht erreichbaren Ziel führt.

Die sicherste Wette scheint die Verwendung einer iframe zu sein. Mit dem folgenden Code wird eine iOS-App geöffnet, wenn sie installiert ist. Wenn dies nicht der Fall ist, führt dies nicht zu einem Fehler (obwohl ein Benutzer möglicherweise darauf hingewiesen wird, dass die Seite nicht erreichbar ist, wenn die App nicht installiert ist):

var frame = document.createElement('iframe');
frame.src = 'myapp://?params=...';
frame.style.display = 'none';
document.body.appendChild(frame);

// the following is optional, just to avoid an unnecessary iframe on the page
setTimeout(function() { document.body.removeChild(frame); }, 4);
8

Versuchen Sie es wie folgt : Die Indexseite

<html><head></head><body>
<?php
$app_url = urlencode('YourApp://profile/blabla');
$full_url = urlencode('http://yoursite.com/profile/bla');
?>   

<iframe src="receiver.php?mylink1=<?php echo $app_url;?>" width="1px" height="1px" scrolling="no" frameborder="0"></iframe>
<iframe src="receiver.php?mylink2=<?php echo $full_url;?>" width="1px" height="1px" scrolling="no" frameborder="0"></iframe>

</body>
</html>

die receiver.php Seite:

<?php if ($first == $_GET['mylink1'])) { ?>
   <script type="text/javascript">
   self.window.location = "<?php echo $first;?>"; 
   </script>

<?php } if ($second == $_GET['mylink2'])) { ?>
   <script type="text/javascript">
   window.parent.location.href = "<?php echo $second ;?>"; 
   //window.top.location.href=theLocation;
   //window.top.location.replace(theLocation);
   </script>
<?php } ?>
0
T.Todua