如何检查iPhone上的网页是否安装了应用程序?

Joa*_*rom 133 iphone web-applications mobile-safari ios

我想创建一个网页,如果iPhone没有安装应用程序,将iPhone重定向到应用程序商店的页面,但如果iPhone安装了应用程序,我希望它打开应用程序.

我已经在iPhone应用程序中实现了一个自定义URL,所以我有一个应用程序的URL,如下所示:

myapp://
Run Code Online (Sandbox Code Playgroud)

如果此网址无效,我希望该网页重定向到应用商店.这有可能吗?

如果我没有在手机上安装应用程序并在safari中编写myapp:// url,我得到的只是一条错误消息.

即使存在javascript的丑陋黑客,我真的想知道吗?

小智 183

据我所知,您无法通过浏览器检查是否安装了应用程序.

但您可以尝试将手机重定向到应用程序,如果没有任何反应,请将手机重定向到指定的页面,如下所示:

setTimeout(function () { window.location = "https://itunes.apple.com/appdir"; }, 25);
window.location = "appname://";
Run Code Online (Sandbox Code Playgroud)

如果第二行代码给出结果,则永远不会执行第一行.

希望这可以帮助!

类似的问题:

  • 目前在iOS 6.1.2中,这似乎仅适用于webapp模式.如果直接从浏览器使用应用程序,它会按预期打开外部应用程序,但超时也会被触发并重定向浏览器. (16认同)
  • 如果未安装该应用程序,则会抛出一个丑陋的"找不到页面"警报.无论如何我们可以压制它 (4认同)
  • @AkshatAgarwal,你能详细说明如何编码来抑制'page not found alert' (3认同)
  • 现在有新的方法可以在Android和iOS中实现此功能。看看[Android应用程序链接](https://developer.android.com/training/app-links/index.html#add-app-links)和[iOS通用链接](https://developer.apple .com / library / content / documentation / General / Conceptual / AppSearch / UniversalLinks.html) (2认同)
  • 它打开应用程序,但还将浏览器重定向到应用程序商店/游戏商店。有什么方法/黑客可以防止这种情况吗? (2认同)

Ala*_*air 151

为了进一步接受已接受的答案,您有时需要添加额外的代码来处理启动应用程序后返回浏览器的人员 - 只要他们这样做,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://";
Run Code Online (Sandbox Code Playgroud)

这样,如果代码执行冻结(即应用程序切换),它将无法运行.

  • 即使在 50 时,这也会始终打开我的应用程序和应用程序商店。iOS 12 (9认同)
  • 这个解决方案比其他解决方案要好得多,我不得不将时间增加到50 (2认同)

bra*_*jam 27

iOS Safari具有一项功能,允许您在网页中添加"智能"横幅,该横幅将链接到您的应用程序(如果已安装)或App Store.

您可以通过向meta页面添加标记来完成此操作.如果您希望应用在加载时执行特殊操作,您甚至可以指定详细的应用URL.

有关详细信息,请参阅Apple的智能应用横幅推广应用页面.

该机制具有易于呈现标准化横幅的优点.缺点是您无法控制外观或位置.此外,如果在Safari以外的浏览器中查看页面,则所有投注均已关闭.

  • 但是,如果用户尚未安装,它不会显示应用横幅 (2认同)

Seb*_*ber 13

截至2017年,似乎没有可靠的方法来检测安装的应用程序,并且重定向技巧无处不在.

对于像我这样需要直接从电子邮件深层链接的人(很常见),值得注意以下几点:

  • 使用appScheme://发送电子邮件将无法正常工作,因为这些链接将在Gmail中过滤

  • 自动重定向到appScheme://被Chrome阻止:我怀疑Chrome要求重定向与用户互动同步(如点击)

  • 您现在可以在没有appScheme的情况下进行深层链接://它更好,但它需要一个现代平台和其他设置.Android iOS


值得注意的是,其他人已经深入思考了这一点.如果你看看Slack如何实现他的"魔术链接"功能,你会注意到:

  • 它会发送一封包含常规http链接的电子邮件(可以使用Gmail)
  • 该网页有一个大按钮,链接到appScheme://(确定Chrome)


bra*_*jam 9

@Alistair在这个答案中指出,有时用户在打开应用程序后会返回浏览器.该答案的评论者表示,使用的时间值必须根据iOS版本进行更改.当我们的团队不得不处理这个问题时,我们发现初始超时的时间值以及我们是否已经返回浏览器必须进行调整,并且通常不适用于所有用户和设备.

不是使用任意时间差阈值来确定我们是否已返回浏览器,而是检测"pagehide"和"pageshow"事件是有意义的.

我开发了以下网页来帮助诊断发生了什么.它随着事件的展开而增加了HTML诊断功能,主要是因为使用控制台日志记录,警报或Web Inspector,jsfiddle.net等技术都在这个工作流程中存在缺陷.Javascript不是使用时间阈值,而是计算"pagehide"和"pageshow"事件的数量,以查看它们是否已经发生.我发现最强大的策略是使用1000的初始超时(而不是其他人报告/建议的25,50或100).

这可以在本地服务器上提供,例如python -m SimpleHTTPServer在iOS Safari上查看.

要使用它,请按"打开已安装的应用程序"或"未安装应用程序"链接.这些链接应分别导致地图应用程序或App Store打开.然后,您可以返回Safari以查看事件的顺序和时间.

(注意:这仅适用于Safari.对于其他浏览器(如Chrome),您必须为pagehide/show-equivalent事件安装处理程序).

更新:正如@Mikko在评论中指出的那样,iOS8中显然不再支持我们正在使用的pageshow/pagehide事件.

<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>
Run Code Online (Sandbox Code Playgroud)


ham*_*son 9

您可以查看试图解决问题的插件.它基于missemisa和Alastair等描述的相同方法,但使用隐藏的iframe代替.

https://github.com/hampusohlsson/browser-deeplink