iOS9:如果可能的话,尝试通过scheme打开应用程序,否则重定向到应用商店。

12 浏览
0 Comments

iOS9:如果可能的话,尝试通过scheme打开应用程序,否则重定向到应用商店。

我的问题是关于iOS9!\n我有一个HTML落地页,如果应用已经安装,我想通过URL方案将用户重定向到我的应用程序,否则将重定向到Appstore。\n我的代码是:\n

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);
  // 创建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);
}

\n问题是在Safari iOS9中,iframe技巧不起作用。\n有什么想法为什么会这样吗?\n我的iframe技巧基于这个答案。

0
0 Comments

问题的原因是在iOS9中,当尝试通过scheme打开应用时,如果应用不存在,则无法重定向到App Store。解决方法是使用Universal Links来支持应用,在Safari中避免使用自定义的JavaScript或iframe解决方案,将代码替换为支持的Universal Link。通过配置应用的域名和路径,iOS9会自动响应该链接并打开应用。但是需要注意的是,如果应用未安装,它仍然无法打开App Store。

0
0 Comments

iOS9: 尝试通过scheme打开应用程序,如果不可能,则重定向到App Store的问题出现的原因是iOS 9之后的版本在使用window.location时会弹出一个“在应用中打开”对话框,而不再直接打开应用。解决方法是通过设置scheme来尝试打开应用,如果失败则重定向到App Store。

解决方法的代码示例可在https://bartt.me/openapp中找到,该示例通过以下步骤实现:

  1. 点击“在Twitter应用中打开”按钮时,会启动Twitter应用程序。
  2. 如果没有安装Twitter应用,会回退到App Store中的Twitter应用。
  3. 在不需要用户选择“在应用中打开”对话框的情况下,重定向到Twitter或App Store。
  4. 在iOS和Android的所有浏览器中都能正常工作。

更多信息请参考https://lab.bartt.me/openapp的源代码。

此功能在某个时间被暂时关闭,但现在已经重新启用。

关于第3点,我在iOS 9.3.5上进行了测试,似乎无法在用户未点击“在Twitter中打开”对话框中的“打开”按钮的情况下打开Twitter应用。

对于iOS 9是否可以在没有“在应用中打开”对话框的情况下工作,请提供代码以符合Stack Overflow的规则。

_gluateng 我已更新源代码的链接。

这似乎在iOS Safari浏览器中无法正常工作(或已不再适用)。当用户在iOS 13上没有安装Twitter应用并点击按钮时,会弹出通用的“Safari无法打开此页面,因为页面无效”的警告。

0
0 Comments

iOS 9: 尝试通过scheme打开应用,如果不可行则重定向到App Store

随着iOS 9的发布,开发者们发现之前使用的iframe技巧已经不再适用。推测苹果公司意识到这会更迅速地促使开发者们实现Universal Links(通用链接)。

即使如此,仍然可以设置window.location='your-uri-scheme://';,并在500ms后回退到App Store。这种方法需要在弹出窗口之间进行一种“舞蹈”,正如我们在Branch公司所做的(作为Universal Links不起作用时的备选方案)。

window.location = 'your-uri-scheme://'; // 如果应用未安装,会出现错误信息
setTimeout(function() {
   // 如果深度链接失败,应该在这里链接到App Store
   window.location = "https://itunes.apple.com/us/app/myapp/id123456789?ls=1&mt=8";
}, 500);

很遗憾我没有更好的答案给你。iOS 9的功能确实更加有限。

如果你选择使用通用链接,可以查看我在这里的回答,或者阅读这篇教程,获取关于通用链接所需的有用概述。

当位置变化和回退定时器被用户交互事件(例如按钮的onclick处理程序)调用时,与运行例如onload不同,定时器中的位置变化总是执行,用户总是被重定向到App Store。在这种交互场景中,似乎由于第一个window.location赋值的结果而显示的“在'appname'中打开此页面”的弹出对话框不能阻止进一步的位置变化。此外,超时时间可以低至1ms,我在500和1之间没有看到任何区别,包括在Chrome浏览器中。

进一步说明,在确保交互场景中的流程按预期工作的情况下,您需要通过将整个流程(包括第一个window.location赋值)包裹在另一个定时器中来“创建间接性”。例如:

setTimeout(function () {
    window.location = 'your-uri-scheme://';
    setTimeout(function () {
        window.location = 'https://itunes.apple.com/us/app/myapp/id123456789?ls=1&mt=8';
    }, 1);
}, 1);

我不明白将其包裹在另一个定时器中有何帮助。在我的例子中并没有起作用。

对我来说,这似乎并不起作用 - 它会显示“打开myapp应用程序?”对话框一秒钟,然后会在setTimeout方法中重定向到我的回退URL。有什么想法吗?

有人解决了这个问题吗?

.bonderenka 看起来是9.2的问题,因为“打开此页面”对话框不再是模态的,所以重定向没有被阻止。

在iOS版本>12.3中,从Safari打开应用后会在瞬间重定向到App Store。

0