我想创建一个网页,如果 iPhone 没有安装应用程序,该页面会将 iPhone 重定向到 App Store,但如果 iPhone 安装了应用程序,我希望它打开应用程序。
我已经在 iPhone 应用程序中实现了一个自定义 URL,所以我有一个应用程序的 URL,类似于:
myapp://
如果这个 URL 无效,我希望页面重定向到 App Store。这可能吗?
如果我没有在手机上安装应用程序并在 Safari 中写入 myapp:// URL,我得到的只是一条错误消息。
即使 JavaScript 存在丑陋的 hack,我也很想知道。
据我所知,您无法通过浏览器检查是否安装了应用程序。
但是您可以尝试将手机重定向到应用程序,如果没有任何反应,将手机重定向到指定页面,如下所示:
setTimeout(function () { window.location = "https://itunes.apple.com/appdir"; }, 25);
window.location = "appname://";
如果第二行代码给出结果,则第一行永远不会执行。
类似的问题:
iPhone 浏览器:检查是否从浏览器安装了 iPhone 应用程序
是否可以为 iPhone 应用程序(如 YouTube 和地图)注册基于 http+域的 URL 方案?
为了进一步接受答案,您有时需要添加额外的代码来处理启动应用程序后返回浏览器的人 - setTimeout 函数将在他们这样做时运行。所以,我做这样的事情:
var now = new Date().valueOf();
setTimeout(function () {
if (new Date().valueOf() - now > 100) return;
window.location = "https://itunes.apple.com/appdir";
}, 25);
window.location = "appname://";
这样,如果代码执行中出现冻结(即应用程序切换),它就不会运行。
iOS Safari 有一项功能,允许您向网页添加“智能”横幅,该横幅将链接到您的应用(如果已安装)或 App Store。
为此,您可以向页面添加一个 meta
标记。如果您希望应用程序在加载时执行一些特殊操作,您甚至可以指定详细的应用程序 URL。
详细信息在 Apple 的 Promoting Apps with Smart App Banners 页面上。
该机制的优点是简单易行,呈现标准化的旗帜。缺点是您无法控制外观或位置。此外,如果该页面是在 Safari 以外的浏览器中查看的,那么所有的赌注都将被取消。
截至 2017 年,似乎没有可靠的方法来检测是否安装了应用程序,并且重定向技巧不会在任何地方都有效。
对于像我这样需要直接从电子邮件中进行深度链接的人(很常见),值得注意以下几点:
使用 appScheme:// 发送电子邮件将无法正常工作,因为这些链接将在 Gmail 中被过滤
自动重定向到 appScheme:// 被 Chrome 阻止:我怀疑 Chrome 需要重定向与用户交互同步(如点击)
您现在可以在没有 appScheme:// 的情况下进行深度链接,这会更好,但它需要一个现代平台和额外的设置。安卓 iOS
值得注意的是,其他人已经对此进行了深入思考。如果您查看 Slack 如何实现他的“魔术链接”功能,您会注意到:
它发送带有常规 HTTP 链接的电子邮件(可以使用 Gmail)
该网页有一个链接到 appScheme:// 的大按钮(可以使用 Chrome)
@Alistair 在 this answer 中指出,有时用户会在打开应用程序后返回浏览器。该答案的评论者表示,必须根据 iOS 版本更改使用的时间值。
当我们的团队不得不处理这个问题时,我们发现初始超时的时间值以及告诉我们是否已经返回浏览器必须进行调整,并且通常不适用于所有用户和设备。
与其使用任意时间差阈值来确定我们是否返回浏览器,不如检测“pagehide”和“pageshow”事件。
我开发了以下网页来帮助诊断发生了什么。它在事件展开时添加了 HTML 诊断,主要是因为使用控制台日志记录、警报或 Web Inspector、jsfiddle.net 等技术在此工作流程中都有其缺点。 JavaScript 不使用时间阈值,而是计算“pagehide”和“pageshow”事件的数量以查看它们是否已发生。我发现最稳健的策略是使用 1000 的初始超时(而不是其他人报告和建议的 25、50 或 100)。
这可以在本地服务器上提供,例如 python -m SimpleHTTPServer
并在 iOS Safari 上查看。
要使用它,请按“打开已安装的应用程序”或“未安装应用程序”链接。这些链接应分别导致地图应用程序或应用程序商店打开。然后,您可以返回 Safari 查看事件的顺序和时间。
(注意:这仅适用于 Safari。对于其他浏览器(如 Chrome),您必须为 pagehide/show-equivalent 事件安装处理程序)。
更新:正如@Mikko 在评论中指出的那样,我们正在使用的 pageshow/pagehide 事件显然在 iOS8 中不再支持。
<html>
<head>
</head>
<body>
<a href="maps://" onclick="clickHandler()">Open an installed app</a>
<br/><br/>
<a href="xmapsx://" onclick="clickHandler()">App not installed</a>
<br/>
<script>
var hideShowCount = 0 ;
window.addEventListener("pagehide", function() {
hideShowCount++;
showEventTime('pagehide');
});
window.addEventListener("pageshow", function() {
hideShowCount++;
showEventTime('pageshow');
});
function clickHandler(){
var hideShowCountAtClick = hideShowCount;
showEventTime('click');
setTimeout(function () {
showEventTime('timeout function ' + (hideShowCount-hideShowCountAtClick) + ' hide/show events');
if (hideShowCount == hideShowCountAtClick){
// app is not installed, go to App Store
window.location = 'http://itunes.apple.com/app';
}
}, 1000);
}
function currentTime()
{
return Date.now()/1000;
}
function showEventTime(event){
var time = currentTime() ;
document.body.appendChild(document.createElement('br'));
document.body.appendChild(document.createTextNode(time + ' ' + event));
}
</script>
</body>
</html>
您可以查看这个试图解决问题的插件。它基于与 misemisa 和 Alastair 等描述的相同方法,但使用隐藏的 iframe。
https://github.com/hampusohlsson/browser-deeplink
我需要做这样的事情,我最终选择了以下解决方案。
我有一个特定的网站 URL,它将打开一个带有两个按钮的页面
按钮一进入网站 按钮二进入应用程序(iPhone / Android 手机 / 平板电脑)。如果未安装应用程序(如另一个 URL 或应用程序商店),您可以从此处回退到默认位置 Cookie 以记住用户的选择
查看我们的新应用或访问网站 | |||||
| |||||
| |||||
|   ; |