Мое решение - отменить навигацию и снова загрузить запрос с помощью loadRequest :. Это будет похоже на поведение UIWebView, которое всегда открывает новое окно в текущем кадре.
Реализуйте WKUIDelegateделегат и установите для него значение _webview.uiDelegate. Затем реализуйте:
Это правильный ответ. Мы безуспешно попробовали принятый ответ. Но ответ @ Cloud работает, и этот ответ на форумах разработчиков объясняет, почему.
Кристофер Пикслей,
5
Это решение сработало для меня. Не забудьте установить UIDelegateсвойство, поскольку эти методы объявлены в WKUIDelegatenot WKNavigationDelegate.
Taketo Sano
1
Хорошо, я вижу, что люди хотят использовать WKWebView вот так. Я реализовал возможность открывать target = _blank-Links в том же WKWebView (как показано выше) в моем проекте github.com/sticksen/STKWebKitViewController .
stk
5
@ChristopherPickslay при использовании этого метода с моим WKWebView URL-адрес запроса всегда пуст, поэтому веб-просмотр направляет на пустую белую страницу, есть идеи?
Джейсон Мюррей,
1
Когда запрос '_blank' отправляется из формы с данными сообщения, я обнаружил, что данные сообщения будут потеряны !!! Любая помощь? @Cloud Wu
Эндрю
66
Ответ от @Cloud Xu - правильный ответ. Для справки, вот это в Swift:
// this handles target=_blank links by opening them in the same view
func webView(webView:WKWebView!, createWebViewWithConfiguration configuration:WKWebViewConfiguration!, forNavigationAction navigationAction:WKNavigationAction!, windowFeatures:WKWindowFeatures!)->WKWebView!{if navigationAction.targetFrame ==nil{
webView.loadRequest(navigationAction.request)}returnnil}
как бы вы его написали, если бы вместо этого хотели, чтобы он открывался в Safari? Также на что мне нужно ссылаться в контроллере представления, чтобы заставить это работать?
Не настоящий дубликат. Существуют различия в необязательности параметров, которые не соответствуют протоколу Swift 4.1 WKUIDelegate в ответе, на который вы ссылаетесь.
yakattack 03
Привет! Когда я загружал WKWebview с URL-адресом Pinterest, мне не удалось открыть «Продолжить с Facebook». Теперь я могу щелкнуть и получить информацию о «Продолжить с Google». Помогите мне, пожалуйста.
Nrv
У меня такая же проблема с wkwebview; логин и перенаправление не работали в моем приложении. Любая помощь ?
Джамшед Алам
1
пожалуйста, кто-нибудь может мне помочь, я назначил делегата uiDelegate на wkwebview, но его метод создания веб-представления с конфигурацией не
вызывается
25
Добавьте себя как WKNavigationDelegate
_webView.navigationDelegate =self;
и реализуйте следующий код в обратном вызове делегата resolvePolicyForNavigationAction: solutionHandler:
-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler
{//this is a 'new window action' (aka target="_blank") > open this URL externally. If we´re doing nothing here, WKWebView will also just do nothing. Maybe this will change in a later stage of the iOS 8 Betaif(!navigationAction.targetFrame){
NSURL *url = navigationAction.request.URL;UIApplication*app =[UIApplication sharedApplication];if([app canOpenURL:url]){[app openURL:url];}}
decisionHandler(WKNavigationActionPolicyAllow);}
PS: Этот код STKWebKitViewControllerвзят из моего небольшого проекта , который обертывает удобный пользовательский интерфейс вокруг WKWebView.
Опечатка. Между WKNavigationActionPolicy и Allow отсутствует точка
цыпленок
@stk Как я могу понять, собирается ли UIApplication открывать ссылку в приложении Safari? Если это ссылка на Appstore - мне нужно открыть ot в приложении Appstore, но если это обычная веб-страница - мне нужно открыть ее в том же WKWebView stackoverflow.com/questions/29056854/…
BergP
1
@LeoKoppelkamm Это не опечатка, это скорее Objective-C, а не Swift. ;)
Аян Сенгупта
1
Это работает для ссылок, но, похоже, не обнаруживает новые окна, открытые с помощью JavaScript, т. window.open(url, "_blank")
Е.
@Crashalot Вы нашли решение для window.open?
Сэм
14
Если вы уже установили WKWebView.navigationDelegate
WKWebView.navigationDelegate = self;
вам просто нужно реализовать:
-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler
{
BOOL shouldLoad =[self shouldStartLoadWithRequest:navigationAction.request];// check the url if necessaryif(shouldLoad && navigationAction.targetFrame ==nil){// WKWebView ignores links that open in new window[webView loadRequest:navigationAction.request];}// always pass a policy to the decisionHandler
decisionHandler(shouldLoad ?WKNavigationActionPolicyAllow:WKNavigationActionPolicyCancel);}
таким образом вам не нужно реализовывать метод WKUIDelegate.
Я подтверждаю, что код Swift Билла Вайнмана верен. Но необходимо упомянуть, что вам также необходимо делегировать UIDelegate для его работы, если вы новичок в разработке iOS, как я.
Что-то вроде этого:
self.webView?.UIDelegate=self
Итак, есть три места, где вам нужно внести изменения.
Введите свой код, это:self.webView.UIDelegate = self
Хенрик Петтерсон,
Не уверен, подразумевается ли это, но для того, чтобы эта строка кода работала в iOS 10, вам ViewControllerнеобходимо наследовать WKUIDelegate. ieclass ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate
ltrainpr
4
Вы также можете нажать другой контроллер представления или открыть новую вкладку и т. Д .:
Надо ли ставить vc.url? Я не устанавливаю его, и веб-представление загружается правильно. Кроме того, по моему опыту, я вижу вызовы только createWebViewWithConfigurationтогда, когда navigationAction.targetFrameесть nil. Можете ли вы описать сценарий, в котором это было бы неправдой?
Мейсон Дж. Жвити
@ MasonG.Zhwiti Прошлой осенью я активно использовал WKWebViews для проекта, но с тех пор ничего не сделал с ними, поэтому я действительно не могу ответить на ваш вопрос. В то время, когда я опубликовал вышеизложенное, это действительно сработало. Я не могу понять, как это работает, не установив vc.url.
Дэвид Х
Я думаю, что это работает без него, потому что вы возвращаете созданное веб-представление, а затем (я предполагаю), что бы вас ни попросили создать, оно позаботится об использовании веб-представления для загрузки рассматриваемого URL-адреса.
привет, после входа в систему с помощью facebook, как открыть окно общего доступа для общего доступа facebook аналогичным образом? Я вошел в систему, создав новый wkwebview, теперь пользователь вошел в систему. Как теперь отслеживать окно общего доступа?
Как видите, мы просто открываем webViewновый URL с новым URL и контролируем возможность закрытия, если вам нужен ответ от него, который second webviewбудет отображаться при первом.
Я столкнулся с некоторыми проблемами, которые нельзя решить, просто используя webView.load(navigationAction.request) . Поэтому я использую create a new webView, и он отлично работает.
**Use following function to create web view**
func initWebView(configuration:WKWebViewConfiguration){let webView =WKWebView(frame:UIScreen.main.bounds, configuration: configuration)
webView.uiDelegate =self
webView.navigationDelegate =self
view.addSubview(webView)self.webView = webView
}**InViewDidLoad:**if webView ==nil{ initWebView(configuration:WKWebViewConfiguration())}
webView?.load(url: url1)**WKUIDelegateMethod need to be implemented**
extension WebViewController:WKUIDelegate{
func webView(_ webView:WKWebView, createWebViewWith configuration:WKWebViewConfiguration,for navigationAction:WKNavigationAction, windowFeatures:WKWindowFeatures)->WKWebView?{// push new screen to the navigation controller when need to open url in another "tab"print("url:\(String(describing: navigationAction.request.url?.absoluteString))")iflet url = navigationAction.request.url, navigationAction.targetFrame ==nil{let viewController =WebViewController()
viewController.initWebView(configuration: configuration)
viewController.url1 = url
DispatchQueue.main.async{[weak self]inself?.navigationController?.pushViewController(viewController, animated:true)}return viewController.webView
}returnnil}}
extension WKWebView{
func load(url: URL){ load(URLRequest(url: url))}}
Ответы:
Мое решение - отменить навигацию и снова загрузить запрос с помощью loadRequest :. Это будет похоже на поведение UIWebView, которое всегда открывает новое окно в текущем кадре.
Реализуйте
WKUIDelegate
делегат и установите для него значение_webview.uiDelegate
. Затем реализуйте:источник
UIDelegate
свойство, поскольку эти методы объявлены вWKUIDelegate
notWKNavigationDelegate
.Ответ от @Cloud Xu - правильный ответ. Для справки, вот это в Swift:
источник
Чтобы использовать последнюю версию Swift 4.2+
Расширьте свой класс с помощью WKUIDelegate
Установить делегата для просмотра в Интернете
Внедрить метод протокола
источник
Добавьте себя как WKNavigationDelegate
и реализуйте следующий код в обратном вызове делегата resolvePolicyForNavigationAction: solutionHandler:
PS: Этот код
STKWebKitViewController
взят из моего небольшого проекта , который обертывает удобный пользовательский интерфейс вокруг WKWebView.источник
window.open(url, "_blank")
Если вы уже установили WKWebView.navigationDelegate
WKWebView.navigationDelegate = self;
вам просто нужно реализовать:
таким образом вам не нужно реализовывать метод WKUIDelegate.
источник
Ни одно из этих решений не помогло мне, я решил проблему следующим образом:
1) Реализация WKUIDelegate
2) Установка делегата UIDelegate для wkWebview
3) Реализация метода createWebViewWithConfiguration
источник
Cloud xu
Ответ решает мою проблему.Если кому-то нужна эквивалентная версия Swift (4.x / 5.0), вот она:
Конечно,
webView.uiDelegate
сначала нужно установить .источник
Я подтверждаю, что код Swift Билла Вайнмана верен. Но необходимо упомянуть, что вам также необходимо делегировать UIDelegate для его работы, если вы новичок в разработке iOS, как я.
Что-то вроде этого:
Итак, есть три места, где вам нужно внести изменения.
источник
self.webView.UIDelegate = self
ViewController
необходимо наследоватьWKUIDelegate
. ieclass ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate
Вы также можете нажать другой контроллер представления или открыть новую вкладку и т. Д .:
источник
vc.url
? Я не устанавливаю его, и веб-представление загружается правильно. Кроме того, по моему опыту, я вижу вызовы толькоcreateWebViewWithConfiguration
тогда, когдаnavigationAction.targetFrame
естьnil
. Можете ли вы описать сценарий, в котором это было бы неправдой?На основе ответа аллена хуана
подробности
Цели
target=“_blank”
push
просмотр контроллера с помощью webView, если текущий контроллер имеетnavigationController
present
контроллер представления с помощью webView во всех остальных случаяхРешение
Полный образец
добавьте в свой Info.plist настройку безопасности транспорта
Раскадровка
Версия 1
Версия 2
источник
Это сработало для меня:
Как видите, мы просто открываем
webView
новый URL с новым URL и контролируем возможность закрытия, если вам нужен ответ от него, которыйsecond webview
будет отображаться при первом.источник
Я столкнулся с некоторыми проблемами, которые нельзя решить, просто используя
webView.load(navigationAction.request)
. Поэтому я использую create a new webView, и он отлично работает.источник
источник