【问题标题】:iOS9: Try to open app via scheme if possible, or redirect to app store otherwiseiOS9:如果可能,尝试通过方案打开应用程序,否则重定向到应用程序商店
【发布时间】:2015-12-17 19:32:51
【问题描述】:

我的问题是关于仅限 iOS9!

我有一个HTML 登录页面,如果安装了应用,我会尝试通过 URL 方案将用户重定向到我的应用,或者重定向到 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 中不起作用。

知道为什么吗?

我的iframe 技巧基于this 答案。

【问题讨论】:

  • openApp 是否重定向到 safari
  • @Anbu.Karthik 你是什么意思?
  • 对不起,在你的情况下是否重定向到 safari
  • 但我想尽可能切换应用(如果不可能,则不显示任何警报)或重定向到应用商店。我不想以任何方式重定向..
  • 朋友,我不懂javascript,但我在iOS中的三个以上应用程序上都研究过URL架构,我一定支持你找到解决方案,

标签: javascript ios iframe safari ios9


【解决方案1】:

也许尝试为您提供通用链接的应用支持

想法: 避免在 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

【讨论】:

  • @carlos.baeza 这是解决问题的好方法,但问题请参阅javascriptiframeSafari
  • 这应该是正确的答案@carlos.baeza ...唯一的问题是通用链接绑定太复杂了。但你是对的。我给你加分了。
  • 但是如果没有安装应用程序就不会打开应用商店
【解决方案2】:

iframe 技巧不再有效——我猜 Apple 知道它会鼓励更多开发人员更快地实施通用链接。

您仍然可以设置window.location='your-uri-scheme://'; 并在 500 毫秒后回退到 App Store。如果您采用这种方法,弹出窗口之间会有“舞蹈”,就像我们在Branch 所做的那样(如果通用链接不起作用,我们会作为后备)。

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 肯定更受限制。

如果您想了解通用链接所需的有用信息,请查看我的回答 hereread this tutorial

【讨论】:

  • @formatjam 是,如果未安装应用程序。很不幸。
  • 从用户交互事件(例如按钮上的 onclick 处理程序)调用位置更改和回退计时器时,而不是运行例如onload 时,计时器中的位置更改总是会执行,并且用户总是会被撞到应用商店。看起来在这个交互式场景中,作为第一个 window.location 分配的结果显示的“在 'appname' 中打开此页面”弹出对话框不会阻止进一步的位置更改。此外,超时似乎可以低至 1 毫秒,我没有看到 500 和 1 之间的任何差异,包括 Chrome。
  • @obiuquido144 我不明白如何将它包装在另一个超时帮助中。我的情况是它没有。
  • 这似乎对我不起作用 - 它会显示“在应用程序中打开 myapp?”对话框一秒钟,然后它将重定向到我在 setTimeout 方法中的后备 url。知道为什么吗?
  • 在 iOS 版本 >12.3 上,从 Safari 打开应用程序后,它会在瞬间重定向到 App Store。
【解决方案3】:

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

    如前所述,在 iOS 9 上设置 window.location 仍然有效。但是,这会打开一个在应用程序中打开的对话框。我在https://bartt.me/openapp 上放了一个例子:

    1. 点击在 Twitter 应用中打开时启动 Twitter。
    2. 回退到 App Store 中的 Twitter 应用。
    3. 在应用程序中打开对话框中在用户选择打开的情况下重定向到 Twitter 或 App Store。
    4. 适用于 iOS 和 Android 上的所有浏览器。

    查看https://lab.bartt.me/openapp的来源了解更多信息。

    【讨论】:

    • 又出现了,暂时关闭了。
    • 重新第 3 点,我在 iOS 9.3.5 中进行了测试,如果没有用户在“打开此页面”中的“打开”按钮中单击打开,它似乎无法打开 Twitter 'Twitter'”对话框。
    • +1 如果没有“在应用程序中打开”对话框,它是否可以在 iOS 9 中使用?感谢分享。请您将代码添加到帖子中以符合 Stack Overflow 规则。
    • @BartTeeuwisse 你能提供代码吗?链接页面导致 404。谢谢!
    • @der_gluateng 我已经更新了源代码的链接。
    【解决方案5】:

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

    https://github.com/prabeengiri/DeepLinkingToNativeApp

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      相关资源
      最近更新 更多