iOS9:如果可能的话,尝试通过scheme打开应用程序,否则重定向到应用商店。
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
技巧基于这个答案。
iOS9: 尝试通过scheme打开应用程序,如果不可能,则重定向到App Store的问题出现的原因是iOS 9之后的版本在使用window.location
时会弹出一个“在应用中打开”对话框,而不再直接打开应用。解决方法是通过设置scheme来尝试打开应用,如果失败则重定向到App Store。
解决方法的代码示例可在https://bartt.me/openapp中找到,该示例通过以下步骤实现:
- 点击“在Twitter应用中打开”按钮时,会启动Twitter应用程序。
- 如果没有安装Twitter应用,会回退到App Store中的Twitter应用。
- 在不需要用户选择“在应用中打开”对话框的情况下,重定向到Twitter或App Store。
- 在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无法打开此页面,因为页面无效”的警告。
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。