Короткий ответ: надёжно — никак. В iOS WebView (особенно WKWebView) решение за хост‑приложением, а не за страницей: чистым JavaScript вы не можете гарантированно «выдернуть» пользователя в системный Safari во всех случаях. Большинство «трюков» из интернета работают только в старых вебвью или в специфичных контейнерах (Cordova/Capacitor) и ломаются в типичных современных WKWebView, где приложение решает, как обрабатывать новые окна и навигации.
Ниже — что реально можно попробовать из JS и какие ограничения у каждого способа, плюс практичные рекомендации (включая нативные патчи, если у вас есть контакт с разработчиками приложения).
1) Простейшие JS/HTML варианты (иногда работают, но ненадёжно)
- <a href="https://..." target="_blank" rel="noopener noreferrer">Link</a>
- поведение: в некоторых встраиваниях target="_blank" генерирует запрос на «новое окно». Если хост‑приложение не обработало этот запрос, иногда система откроет внешний браузер. В современных WKWebView чаще обработка запроса ложится на приложение, и переход остаётся в WebView (или вообще блокируется).
- window.open(url, '_blank')
- аналогично — может вызвать новый оконный запрос, но управление у приложения.
- Создание и программный «клик» по ссылке:
var a = document.createElement('a'); a.href = url; a.target = '_blank'; a.rel = 'noopener noreferrer'; a.click();
- ничем принципиально не лучше первых двух; тоже ненадёжно.
Когда эти методы срабатывают: чаще в UIWebView, в некоторых версиях SFSafariViewController или в приложениях, которые не реализуют обработку «new window» в WKUIDelegate. На практике в современных приложениях — редко.
2) Специальные схемы/универсальные ссылки
- tel:, mailto:, sms: — вызывают соответствующие вне‑приложения приложения (Телефон, Почта) и обычно работают.
- custom URL schemes (myapp://…) — откроют другое приложение, если оно установлено.
- universal links — открывают нативное приложение, если привязано. Но это не открывает Safari.
Вывод: схемы типа tel:/mailto:/myapp:// — работают, но для открытия именно Safari они неприменимы.
3) Плагины/обёртки (требуют контейнера)
- Cordova/PhoneGap: window.open(url, '_system') (InAppBrowser plugin) откроет внешний браузер.
- Capacitor: use Browser plugin (может открывать SFSafariViewController или внешне).
Эти способы требуют, чтобы страница работала в соответствующем контейнере и чтобы в нём был плагин.
4) Что делать, если вы контролируете и страницу, и приложение (рекомендуемый и надёжный способ)
Просить/внедрить нативный обработчик — единственный устойчивый путь:
- Вариант A (WKWebView + Swift): реализовать WKUIDelegate и/или WKNavigationDelegate. Когда навигация приходит с targetFrame == nil (новое окно) — открывать system browser:
Пример (Swift):
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if let url = navigationAction.request.url {
// Открыть в Safari
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
return nil
}
Или в WKNavigationDelegate:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == .linkActivated {
if let url = navigationAction.request.url, /* условие: внешний домен или target=_blank */ {
UIApplication.shared.open(url)
decisionHandler(.cancel)
return
}
}
decisionHandler(.allow)
}
- Вариант B: реализовать JavaScript→Native bridge (window.webkit.messageHandlers.openExternal.postMessage(url)) и в native открыть URL через UIApplication.shared.open.
Эти подходы даёт 100% контроль и работают во всех версиях iOS.
5) Если вы не можете изменить приложение
- Попробуйте target="_blank" / window.open — иногда сработает, но это лотерея.
- Если страница открыта в контейнере Cordova/Capacitor — используйте соответствующий plugin (InAppBrowser/Browser).
- Если ни то, ни другое — договоритесь с владельцем приложения, чтобы они добавили мост или поменяли обработку открытий ссылок.
6) Дополнительные советы/мелочи
- rel="noopener noreferrer" при использовании target="_blank" лучше добавлять — безопаснее и иногда влияет на поведение.
- Некоторые приложения на iOS специально блокируют переходы на внешний браузер по соображениям UX/безопасности: сам сайт ничего с этим не сделает.
- Не пытайтесь «обманывать» с промежуточными редиректами или iframe — хост всё равно сможет перехватить навигацию.
Итог: если вам нужен надёжный способ открывать ссылки в системном Safari с любой WebView на iOS — потребуется сотрудничество с владельцем приложения/разработчиком нативной части (реализовать открытие через UIApplication.open или обработку новых окон в WKUIDelegate / message handler). Чистым JavaScript можно попытаться (target="_blank", window.open), но это ненадёжно и зависит от реализации WebView в приложении.