有几件事情可以改善其他答案。从iOS 9开始,链接可以在UIWebView
或SFSafariViewController
中打开。你可能想要以不同的方式处理它们。
SFSafariViewController
跨应用程序和内置Safari共享Cookie。因此,在您的应用中,您可以通过SFSafariViewController
发出请求,该请求会设置一个表示“我的应用已安装”的cookie。例如,你打开你的网站,要求你的服务器设置这样的cookie。然后,当您收到SFSafariViewController
的请求时,您可以检查该cookie,如果找到该cookie,并将其重定向至MYAPP://
,或者如果不存在,则重定向至应用商店。无需打开网页并执行javascript重定向,您可以从服务器上执行301。像Messages
或Safari
这样的应用共享这些cookie。
UIWebView
是非常棘手的,因为它是完全的沙盒,并与其他任何cookie没有共享。所以你有什么已经在其他的答案被描述退却到:
window.onload = function() {
var iframe = document.createElement("iframe");
var uri = 'MYAPP://';
var interval = setInterval(function() {
// Link to the App Store should go here -- only fires if deep link fails
window.location = "https://itunes.apple.com/us/app/my.app/id123456789?ls=1&mt=8";
}, 500);
iframe.onload = function() {
clearInterval(interval);
iframe.parentNode.removeChild(iframe);
window.location.href = uri;
};
iframe.src = uri;
iframe.setAttribute("style", "display:none;");
document.body.appendChild(iframe);
};
我发现它烦人,这将提示用户,如果他们想离开当前的应用程序(去你的应用程序)即使你的应用程序没有安装。 (从经验上看,只有从UIWebView
才是真实的,如果你从普通的Safari那里做到这一点,那不会发生),但这就是我们得到的!
您可以从您的服务器区别于SFSafariViewController
的UIWebView
,因为他们有不同的用户代理头:在SFSafariViewController
包含Safari浏览器而UIWebView
没有。例如:
Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E269
-> UIWebView
Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E269 Safari/602.1
-> SFSafariViewController
其他注意事项:
在第一种方法
- ,你可能要处理卸载的:如果用户卸载你的应用程序,你仍然有一个cookie,指出应用程序是有但事实并非如此,所以您最终可能会收到
"Can not open URL"
消息。我已经通过最终没有打开的应用程序(这我知道,因为在每一个应用程序打开的,我这个复位失败尝试的cookie)
- 在第二种情况下,试了几次之后,除去该cookie处理它,但目前还不清楚如果你最好使用
setInterval
或setTimeout
。超时的问题在于,如果在提示符打开时触发,它将被忽略。例如,如果您打开Messenger的链接,当iframe尝试加载您的应用程序时,操作系统会询问您“离开Messenger?您即将打开另一个应用程序”。如果在超时500毫秒内没有任何响应,超时中的重定向将被忽略。
- 最后即使
UIWebView
是沙箱,你可以给它一个cookie来识别它,通过它在你的深层链接,而这个ID保存为您的应用程序打开时,在你的服务器对应的设备与应用。下一次,如果您在来自UIWebView
的请求中看到这样的cookie,则可以检查它是否与已知设备匹配,并像以前一样直接与301重定向。
这里是iOS和Android应用重定向一个完整的JS例如:https://gist.github.com/FokkeZB/6635236#file-all-in-one-php – Justin