有幾件事情可以改善其他答案。從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