如何从Web应用程序打开本机iOS应用程序

时间:2012-04-19 21:25:26

标签: javascript ios mobile-safari

摘要我的应用程序具有正确运行的URL方案,我想从主屏幕上存储的Web应用程序启动,而普通的JavaScript重定向方法似乎不起作用

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

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

UIApplication

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

  

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

在Safari中执行时,这个相同的JavaScript工作正常。我使用window.location = "myapp://myparam"; 得到了相同的结果。

网络应用的HTML是:

window.location.replace("myapp://myparam")

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

5 个答案:

答案 0 :(得分:13)

如果您的代码位于移动版Safari中,则代码可以正常工作,但如果来自iOS桌面上的书签,则代码无效。从来没有尝试过,但这就是问题所在。如果我只是将你的JS设置为

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

它可以在浏览器中使用,但是当加入书签时它会失败。由于没有镶边,它可能需要对网址加载时如何加载?我的猜测是苹果不希望预订标记页面访问本地应用程序。另外,我注意到如果我将本地托管的页面加入书签,这可以在移动版Safari中使用,我无法通过书签加载它。真奇怪......

我最适合你的建议是

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

而不是

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

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

答案 1 :(得分: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);

答案 2 :(得分:0)

试试这个: 索引页

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

receiver.php 页面:

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

答案 3 :(得分:0)

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

答案 4 :(得分:-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/)。将脚本添加到您的网络应用顶部,请确保将其另存为.php文件,而不是.html

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