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

总结我有一个正确运行的URLscheme的应用程序,我想从主屏幕上存储的Web应用程序启动,正常的JavaScriptredirect方法似乎不工作。

详细信息我正尝试创build一个iOS Web应用程序,以保存在主屏幕上的链接以全屏模式打开。 networking应用程序需要打开一个特定的本机应用程序。 我已经注册了原生应用程序的urlscheme,并validation了它能正常工作 – 例如,我可以通过直接在我的Safari地址栏中inputscheme来打开本机应用程序。 我也可以使用UIApplication+openURL:方法从其他应用程序中打开它。 我想也打开它可以添加到主屏幕的原生Web应用程序的某些参数。

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

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

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

“无法打开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和移动网站,所以我怀疑我只是缺less一些明显的东西。

如果您的代码在移动版Safari中运行,而您的代码在iOS桌面上的书签中运行则不起作用。 从来没有尝试过,但这是问题。 如果我只是设置你的JS

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

它在浏览器中工作,但是在书签时失败。 它可能不得不做一些事情,因为没有铬的时候,它的书签被加载的URL如何加载? 我的猜测是,苹果不希望预订标记页面访问本地应用程序。 此外,我注意到,如果我书签本地托pipe的页面,这在移动Safari浏览器中工作,我不能通过书签加载它。 它真的很奇怪….

我为你提供的最好的build议是做到这一点

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

代替

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

这样,它将在主屏幕上,但不幸的加载与铬。 这是我能想到的唯一解决scheme。

如果你需要打开一个iOS应用程序,并且还想保留你的页面的function, location.href = 'myapp://?params=...'; 将不会有帮助,因为如果myapp://未注册,则redirect将导致用户无法到达目的地。

最安全的赌注似乎是在使用iframe 。 如果安装了以下代码,将会打开一个iOS应用程序,如果不是,则不会导致失败(尽pipe如果应用程序未安装,可能会提示用户该页面无法到达):

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

这个简单的HTML文件打开应用程序,如果它存在,否则打开商店的URL。 它适用于Android和iOS。

https://gist.github.com/noelrocha/e423ff9ec98011e10ef7

尝试像这样 :索引页面

 <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 } ?> 
 <?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,上述操作会将浏览器redirect到input的URL(http://example.com/)。; 将脚本添加到Web应用程序的顶部,确保将其保存为.php文件而不是.html

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