30

总结我有一个应用程序,其 URL 方案运行正常,我想从存储在主屏幕上的 Web 应用程序启动,但正常的 JavaScript 重定向方法似乎不起作用。

详细信息我正在尝试创建一个 iOS 网络应用程序,它可以从主屏幕上保存的链接以全屏模式打开。Web 应用需要打开特定的原生应用。我已经为本机应用程序注册了 url 方案,并验证了它是否正常工作 - 例如,我可以通过直接在我的 Safari 地址栏中键入方案来打开本机应用程序。我也可以使用+openURL:. UIApplication我还想使用可以添加到主屏幕的本机 Web 应用程序的某些参数打开它。

我想要做的是在本机应用程序中使用 JavaScript:

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

在网络应用程序中使用此代码时,我收到一条警报:

“无法打开 myWebAppName - 无法打开 myWebAppName。错误是“无法显示此 URL”。”。

在 Safari 中执行时,同样的 javascript 可以正常工作。我使用window.location.replace("myapp://myparam").

Web 应用程序的 html 是:

<!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>

我在这里做错了什么?我对javascript和移动网络非常缺乏经验,所以我怀疑我只是错过了一些明显的东西。

4

5 回答 5

14

如果您的代码在移动 Safari 中有效,但如果它来自 iOS 桌面上的书签则无效。以前从来没有这样尝试过,但这就是问题所在。如果我只是将您的 JS 设置为

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

它可以在浏览器中使用,但是在添加书签时会失败。由于没有 chrome,它可能必须与 url 在其书签时如何加载有关?我的猜测是苹果不希望预订标记页面访问本地应用程序。此外,我注意到,如果我为本地托管的页面添加书签,该页面适用于移动 safari,我无法通过书签加载它。实在是太奇葩了......

我给你的最好建议是成功

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

代替

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

这样它就会出现在主屏幕上,但不幸的是会与 chrome 一起加载。这是我能想到的唯一解决方案。

于 2012-04-19T22:12:47.133 回答
8

如果您需要打开已安装的 iOS 应用程序,并且还想保留页面的功能,这location.href = 'myapp://?params=...';将无济于事,因为如果myapp://未注册,重定向会将用户引导到无法访问的目的地。

最安全的选择似乎是使用iframe. 如果安装了 iOS 应用程序,以下代码将打开它,如果未安装,则不会导致失败(尽管如果未安装应用程序,它可能会提醒用户无法访问该页面):

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);
于 2014-04-04T11:22:52.203 回答
0

Try like this: The index page

<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>

the receiver.php page:

<?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 } ?>
于 2014-06-03T19:08:41.457 回答
0

为了提供更新,iOS14 Beta7 似乎没有通过其注册的 x-callback URL 打开任何本地应用程序。

于 2020-09-12T13:32:39.247 回答
-1
<?php 
// Detect device type
$iPod = stripos($_SERVER['HTTP_USER_AGENT'],"iPod");
$iPhone = stripos($_SERVER['HTTP_USER_AGENT'],"iPhone");

// Redirect if iPod/iPhone
if( $iPod || $iPhone ){
    header('Location:http://example.com');      
}
?>

如果设备是 iPod 或 iPhone,以上内容会将浏览器重定向到输入的 URL (http://example.com/)。将脚本添加到 Web 应用程序的顶部,确保将其保存为.php文件而不是.html.

来源: http ://www.schiffner.com/programming-php-classes/php-mobile-device-detection/

于 2012-04-19T22:25:56.107 回答