Как сделать так, чтобы при нажатии на ссылку внутри WebView она открывалась в браузере Safari?

Подскажите, пожалуйста, рабочие способы (только на JavaScript или с использованием JS‑библиотек) открыть URL из WebView во внешнем браузере Safari на iOS — все описанные в интернете варианты сейчас не работают, какие подходы остаются применимыми?
  • 13 февраля 2026 г. 9:44
Ответы на вопрос 1
Короткий ответ: надёжно — никак. В 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 в приложении.
Похожие вопросы