iOS9:尽可能尝试通过方案打开应用程序,否则重定向到应用程序商店

时间:2015-09-21 07:22:28

标签: javascript ios iframe safari ios9

我的问题是仅限iOS9!

我有一个HTML着陆页,如果安装了应用,我会尝试通过网址方案将用户重定向到我的应用,或者重定向到 Appstore 否则。

我的代码是:

document.addEventListener("DOMContentLoaded", function(event) {

  var body = document.getElementsByTagName('body')[0];
  body.onclick = function () {
    openApp();
  };
});

var timeout;

function preventPopup() {

    clearTimeout(timeout);
    timeout = null;
    window.removeEventListener('pagehide', preventPopup);
}

function openApp(appInstanceId, platform) {

  window.addEventListener('pagehide', preventPopup);
  document.addEventListener('pagehide', preventPopup);

  // create iframe
  var iframe = document.createElement("iframe");
  document.body.appendChild(iframe);
  iframe.setAttribute("style", "display:none;");
  iframe.src = 'myscheme://launch?var=val';

  var timeoutTime = 1000;
  timeout = setTimeout(function () {

    document.location = 'https://itunes.apple.com/app/my-app';

  }, timeoutTime);
}

问题在于iframe诀窍在Safari iOS9中不起作用。

知道为什么吗?

基于this回答的iframe诀窍。

5 个答案:

答案 0 :(得分:21)

iframe技巧不再适用 - 我的猜测是Apple知道它会鼓励更多开发人员更快地实施Universal Links。

您仍然可以在500毫秒后设置window.location='your-uri-scheme://';并回退到App Store。有一个"舞蹈"如果你采用这种方法,就像我们在Branch所做的那样(如果Universal Links不起作用,我们会做一个后备)。

window.location = 'your-uri-scheme://'; // will result in error message if app not installed
setTimeout(function() {
   // Link to the App Store should go here -- only fires if deep link fails                
   window.location = "https://itunes.apple.com/us/app/myapp/id123456789?ls=1&mt=8";
}, 500);

我希望我有更好的答案。 iOS 9肯定更受限制。

如果您想要了解Universal Link所需的内容,请查看我的回答hereread this tutorial

答案 1 :(得分:2)

如前所述,在iOS 9上设置window.location仍然有效。但是,这会打开一个Open in App对话框。我在https://bartt.me/openapp上举了一个例子:

  1. 点击在Twitter应用中打开时启动Twitter。
  2. 回到App Store中的Twitter应用程序。
  3. 重定向到Twitter或App Store ,无需用户在在App中打开对话框中选择打开
  4. 适用于iOS和Android上的所有浏览器。
  5. 查看https://lab.bartt.me/openapp的来源以获取更多信息。

答案 2 :(得分:1)

也许尝试向Universal Links提供应用支持

思想: 避免在Safari中使用自定义(JavaScript,iframe)解决方案,将代码替换为支持的通用链接。

实施例

<html>
<head>
...
</head>
<body>
    <div class"app-banner-style">
        <a href="http://yourdomain.com">In app open</a> 
    </div>
...content
</body>
</html>

如果你的应用支持通用链接(例如yourdomain.com),你就可以配置你的域名(和路径),iOS9应该对它做出反应,打开你的应用程序链接。 这只是理论,但我想应该工作:)

https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12

答案 3 :(得分:0)

iframe hack不再适用于ios9。可能的解决方案是使用两个按钮 例如:

$('#goToStoreBtn').text( "go to store" ).click(function(event){
    event.preventDefault();
    event.stopPropagation();
    window.location = storeUrl; // https://itunes.apple.com/...
});

$('#goToAppBtn').text( "go to app" ).click(function(event){
    event.preventDefault();
    event.stopPropagation();
    window.location = appUrl;  // myApp://...
});

答案 4 :(得分:-1)

这是相对较旧的主题,但我创建了一个支持大多数现代移动浏览器深层链接的库。但这需要单独的深层链接页面,需要托管在不同的域中以支持ios9 facebook浏览器中的通用链接。

https://github.com/prabeengiri/DeepLinkingToNativeApp