У меня очень простой UIWebView с контентом из моего пакета приложений. Мне бы хотелось, чтобы любые ссылки в веб-представлении открывались в Safari, а не в веб-представлении. Это возможно?
ios
uiwebview
mobile-safari
Дэвид Бек
источник
источник
Ответы:
Добавьте это к делегату UIWebView:
(отредактировано для проверки типа навигации. Вы также можете проходить через
file://
запросы, которые будут относительными ссылками)Swift версия:
Версия Swift 3:
Версия Swift 4:
Обновить
Как
openURL
не рекомендуется в iOS 10:источник
switch
предпочтительнее для перечислимых типовЕсли кому-то интересно, решение Drawnonward будет выглядеть в Swift следующим образом :
источник
UIWebViewDelegate
Один быстрый комментарий к ответу пользователя306253: будьте осторожны, когда вы пытаетесь загрузить что-то в UIWebView самостоятельно (т.е. даже из кода), этот метод предотвратит это.
Что вы можете сделать, чтобы предотвратить это (спасибо Уэйду):
Вы также можете захотеть обрабатывать
UIWebViewNavigationTypeFormSubmitted
иUIWebViewNavigationTypeFormResubmitted
тип.источник
У других ответов есть одна проблема: они полагаются на то, что вы делаете, а не на саму ссылку, чтобы решить, загружать ее в Safari или в веб-просмотре.
Теперь иногда это именно то, что вы хотите, и это хорошо; но иногда, особенно если у вас есть якорные ссылки на вашей странице, вы действительно хотите открывать только внешние ссылки в Safari, а не внутренние. В этом случае вы должны проверить
URL.host
свойство вашего запроса.Я использую этот фрагмент кода, чтобы проверить, есть ли у меня имя хоста в анализируемом URL-адресе или встроен html:
Конечно, вы можете адаптировать регулярное выражение к вашим потребностям.
источник
if (request.URL?.scheme != "file")
В Swift вы можете использовать следующий код:
Убедитесь, что вы проверили значение URL и навигационный тип.
источник
Вот Xamarin iOS, эквивалентный ответу drawonward.
источник
Принятый ответ не работает.
Если ваша страница загружает URL через Javascript,
navigationType
будетUIWebViewNavigationTypeOther
. К сожалению, к ним также относятся фоновые загрузки страниц, такие как аналитика.Чтобы обнаружить навигацию по страницам, необходимо сравнить
[request URL]
с[request mainDocumentURL]
.Это решение будет работать во всех случаях:
источник
Приложение отклонено Примечание:
в заключение
UIWbView
умер, и Apple больше не примет это.Apple начала отправлять электронную почту всем владельцам приложений, которые все еще используют
UIWebView
:Устаревшее использование API - Apple прекратит прием заявок на приложения, использующие
UIWebView
API.Apple очень серьезно относится к конфиденциальности пользователей, и очевидно, что они не допустят небезопасного просмотра веб-страниц .
Поэтому удалите UIWebView из вашего приложения как можно скорее. не используйте попробовать использовать
UIWebView
в новом созданном приложении, и я предпочитаю использовать,WKWebView
если это возможноПример:
источник
В моем случае я хочу убедиться, что абсолютно все в веб-представлении открывает Safari, кроме начальной загрузки, и поэтому я использую ...
источник