Есть несколько вещей, которые вы можете сделать, чтобы улучшить другие ответы.Начиная с iOS 9, ссылка может быть открыта в UIWebView
или в SFSafariViewController
.Возможно, вы захотите обращаться с ними по-разному.
SFSafariViewController
разделяет файлы cookie между приложениями и встроенным Safari.Таким образом, в вашем приложении вы можете сделать запрос через SFSafariViewController
, который установит cookie-файл с надписью «мое приложение установлено».Например, вы открываете свой веб-сайт, запрашивая у вашего сервера такой файл cookie.Затем в любое время, когда вы получаете запрос от SFSafariViewController
, вы можете проверить этот файл 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, например, этого не произойдет), но это все, что мы получили!
Вы можете отличить UIWebView
от SFSafariViewController
с вашего сервера, поскольку у них другой заголовок пользовательского агента: 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, ОС спросит вас «Выйти из Messenger? Вы собираетесь открыть другое приложение», когда iframe попытается загрузить ваше приложение.Если вы не ответите в любом случае в течение 500 мс времени ожидания, перенаправление в тайм-ауте будет проигнорировано. - Наконец, даже если
UIWebView
находится в «песочнице», вы можете дать ему cookie для его идентификации,передайте его в свою ссылку и сохраните этот идентификатор как соответствующий устройству с вашим приложением на вашем сервере, когда ваше приложение откроется.В следующий раз, если вы увидите такой файл cookie в запросе, поступающем от UIWebView
, вы можете проверить, соответствует ли оно известному устройству с приложением, и перенаправить напрямую с 301, как и раньше.