Solusi saya adalah membatalkan navigasi dan memuat permintaan dengan loadRequest: lagi. Ini akan menjadi perilaku serupa seperti UIWebView yang selalu membuka jendela baru di bingkai saat ini.
Terapkan WKUIDelegatedelegasi dan setel ke _webview.uiDelegate. Kemudian terapkan:
Ini jawaban yang benar. Kami mencoba jawaban yang diterima tetapi tidak berhasil. Tetapi jawaban @ Cloud berhasil, dan tanggapan di forum pengembang ini menjelaskan alasannya.
Christopher Pickslay
5
Solusi ini berhasil untuk saya. Jangan lupa untuk menyetel UIDelegateproperti, karena metode ini dideklarasikan dalam WKUIDelegatenot WKNavigationDelegate.
Taketo Sano
1
Oke, saya melihat bahwa orang ingin menggunakan WKWebView seperti ini. Saya menerapkan kemungkinan untuk membuka target = _blank-Links di WKWebView yang sama (seperti yang ditunjukkan di atas) di proyek saya github.com/sticksen/STKWebKitViewController .
stk
5
@ChristopherPickslay saat menggunakan metode ini dengan WKWebView saya, url permintaan selalu kosong, jadi tampilan web mengarahkan ke halaman putih kosong, ada ide?
Jason Murray
1
Ketika permintaan '_blank' dikirim dari formulir dengan data posting, saya menemukan data posting akan hilang !!! Ada bantuan? @Cloud Wu
Andrew
66
Jawaban dari @Cloud Xu adalah jawaban yang benar. Hanya untuk referensi, ini dia di 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}
Bukan duplikat asli. Ada perbedaan dalam opsionalitas parameter yang tidak sesuai dengan protokol Swift 4.1 WKUIDelegate dalam jawaban yang Anda tautkan.
yakattack
Hai, Saat saya memuat WKWebview dengan URL Pinterest, saya tidak dapat membuka "Lanjutkan dengan Facebook". Sekarang saya bisa mengklik dan mendapatkan informasi tentang "Lanjutkan dengan Google". Tolong bantu aku.
Nrv
Saya menghadapi masalah yang sama dengan wkwebview; login dan redirect tidak berfungsi di aplikasi saya. Ada Bantuan?
Jamshed Alam
1
tolong ada yang bisa membantu saya, saya telah menugaskan delegasi uiDelegate ke wkwebview tetapi metode membuat tampilan web dengan konfigurasi tidak dipanggil
chetan panchal
25
Tambahkan diri Anda sebagai WKNavigationDelegate
_webView.navigationDelegate =self;
dan implementasikan kode berikut dalam delegasi callback decisionPolicyForNavigationAction: decisionHandler:
-(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: Kode ini berasal dari proyek kecil saya STKWebKitViewController, yang membungkus UI yang dapat digunakan di sekitar WKWebView.
Ada kesalahan ketik. Ada titik yang hilang antara WKNavigationActionPolicy dan Allow
ayam
@stk Bagaimana saya bisa memahami jika UIApplication akan membuka tautan di aplikasi Safari? Jika ini adalah tautan Appstore - Saya perlu membukanya di aplikasi Appstore, tetapi jika ini adalah laman web biasa - Saya perlu membukanya di WKWebView stackoverflow.com/questions/29056854/… yang
BergP
1
@LeoKoppelkamm Ini bukan salah ketik melainkan Objective-C bukan Swift. ;)
Ayan Sengupta
1
Ini berfungsi untuk tautan, tetapi tampaknya tidak mendeteksi jendela baru yang dibuka dengan JavaScript, yaitu,window.open(url, "_blank")
Crashalot
@ Crashalot Apakah Anda menemukan solusi untuk window.open?
Sam
14
Jika Anda sudah menyetel WKWebView.navigationDelegate
WKWebView.navigationDelegate = diri;
Anda hanya perlu menerapkan:
-(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);}
dengan cara ini Anda tidak perlu mengimplementasikan metode WKUIDelegate.
Saya mengonfirmasi bahwa kode Swift Bill Weinman sudah benar. Tetapi perlu disebutkan bahwa Anda juga perlu mendelegasikan UIDelegate agar berfungsi, jika Anda baru mengenal iOS berkembang seperti saya.
Sesuatu seperti ini:
self.webView?.UIDelegate=self
Jadi ada tiga tempat yang Anda perlukan untuk melakukan perubahan.
Ketik kode Anda, ini:self.webView.UIDelegate = self
Henrik Petterson
Tidak yakin apakah itu tersirat, tetapi agar baris kode ini berfungsi di iOS 10, Anda ViewControllerharus mewarisi WKUIDelegate. yaituclass ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate
ltrainpr
4
Anda juga dapat mendorong pengontrol tampilan lain, atau membuka tab baru, dll:
Apakah perlu diatur vc.url? Saya tidak menyetelnya, dan tampilan web dimuat dengan benar. Juga, dalam pengalaman saya saya hanya seeing createWebViewWithConfigurationdipanggil saat navigationAction.targetFrameini nil. Dapatkah Anda menjelaskan skenario yang tidak benar?
Mason G.Zhwiti
@ MasonG.Zhwiti Saya secara aktif menggunakan WKWebViews untuk sebuah proyek musim gugur lalu, tetapi sejak itu saya tidak melakukan apa pun dengan mereka - jadi saya benar-benar tidak dapat menjawab pertanyaan Anda. Pada saat saya memposting di atas, itu berhasil. Saya tidak dapat memahami cara kerjanya tanpa mengatur vc.url sekalipun.
David H
Menurut saya ini berfungsi tanpa karena Anda mengembalikan tampilan web yang Anda buat, dan kemudian (saya menebak) apa pun yang meminta Anda untuk membuatnya, tetap menggunakan tampilan web untuk memuat URL yang dipermasalahkan.
hai, setelah login dengan facebook, bagaimana cara membuka jendela share untuk share facebook dengan cara yang sama? Saya telah masuk dengan membuat wkwebview baru, sekarang pengguna masuk. Sekarang bagaimana cara melacak jendela berbagi?
Jamshed Alam
Terima kasih, solusi Anda menyelamatkan hidup saya :)
Seperti yang Anda lihat, apa yang kami lakukan di sini hanyalah membuka yang baru webViewdengan url baru dan mengontrol kemungkinan ditutup, hanya jika Anda memerlukan respons dari itu second webviewuntuk ditampilkan terlebih dahulu.
Saya mengalami beberapa masalah yang tidak dapat diselesaikan hanya dengan menggunakan webView.load(navigationAction.request). Jadi saya menggunakan create a new webView untuk dilakukan dan itu berfungsi dengan baik.
**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))}}
Jawaban:
Solusi saya adalah membatalkan navigasi dan memuat permintaan dengan loadRequest: lagi. Ini akan menjadi perilaku serupa seperti UIWebView yang selalu membuka jendela baru di bingkai saat ini.
Terapkan
WKUIDelegate
delegasi dan setel ke_webview.uiDelegate
. Kemudian terapkan:sumber
UIDelegate
properti, karena metode ini dideklarasikan dalamWKUIDelegate
notWKNavigationDelegate
.Jawaban dari @Cloud Xu adalah jawaban yang benar. Hanya untuk referensi, ini dia di Swift:
sumber
Untuk menggunakan versi terbaru Swift 4.2+
Perluas kelas Anda dengan WKUIDelegate
Tetapkan delegasi untuk tampilan web
Menerapkan metode protokol
sumber
Tambahkan diri Anda sebagai WKNavigationDelegate
dan implementasikan kode berikut dalam delegasi callback decisionPolicyForNavigationAction: decisionHandler:
PS: Kode ini berasal dari proyek kecil saya
STKWebKitViewController
, yang membungkus UI yang dapat digunakan di sekitar WKWebView.sumber
window.open(url, "_blank")
Jika Anda sudah menyetel WKWebView.navigationDelegate
WKWebView.navigationDelegate = diri;
Anda hanya perlu menerapkan:
dengan cara ini Anda tidak perlu mengimplementasikan metode WKUIDelegate.
sumber
Tak satu pun dari solusi itu berhasil untuk saya, saya menyelesaikan masalah dengan:
1) Pelaksana WKUIDelegate
2) Mengatur delegasi UIDelegate dari wkWebview
3) Menerapkan metode createWebViewWithConfiguration
sumber
Cloud xu
Jawabannya memecahkan masalah saya.Jika seseorang membutuhkan versi Swift (4.x / 5.0) yang setara, ini dia:
Tentu Anda harus mengaturnya
webView.uiDelegate
terlebih dahulu.sumber
Saya mengonfirmasi bahwa kode Swift Bill Weinman sudah benar. Tetapi perlu disebutkan bahwa Anda juga perlu mendelegasikan UIDelegate agar berfungsi, jika Anda baru mengenal iOS berkembang seperti saya.
Sesuatu seperti ini:
Jadi ada tiga tempat yang Anda perlukan untuk melakukan perubahan.
sumber
self.webView.UIDelegate = self
ViewController
harus mewarisiWKUIDelegate
. yaituclass ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate
Anda juga dapat mendorong pengontrol tampilan lain, atau membuka tab baru, dll:
sumber
vc.url
? Saya tidak menyetelnya, dan tampilan web dimuat dengan benar. Juga, dalam pengalaman saya saya hanya seeingcreateWebViewWithConfiguration
dipanggil saatnavigationAction.targetFrame
ininil
. Dapatkah Anda menjelaskan skenario yang tidak benar?Berdasarkan jawaban allen huang
Detail
Target
target=“_blank”
push
lihat pengontrol dengan webView jika pengontrol saat ini memilikinyanavigationController
present
lihat pengontrol dengan webView dalam semua kasus lainnyaLarutan
Sampel lengkap
tambahkan pengaturan keamanan transportasi Info.plist Anda
Papan cerita
Versi 1
Versi 2
sumber
Ini berhasil untuk saya:
Seperti yang Anda lihat, apa yang kami lakukan di sini hanyalah membuka yang baru
webView
dengan url baru dan mengontrol kemungkinan ditutup, hanya jika Anda memerlukan respons dari itusecond webview
untuk ditampilkan terlebih dahulu.sumber
Saya mengalami beberapa masalah yang tidak dapat diselesaikan hanya dengan menggunakan
webView.load(navigationAction.request)
. Jadi saya menggunakan create a new webView untuk dilakukan dan itu berfungsi dengan baik.sumber
sumber