উত্তর:
আমার সমাধানটি নেভিগেশন বাতিল করা এবং অনুরোধটি লোডরয়েউয়েস্টের সাথে লোড করা: আবার। এটি ইউআইওউবভিউয়ের মতো একই আচরণে আসবে যা বর্তমান ফ্রেমে সর্বদা নতুন উইন্ডো খোলায়।
বাস্তবায়ন WKUIDelegate
প্রতিনিধি এবং এটি সেট _webview.uiDelegate
। তারপরে প্রয়োগ করুন:
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
if (!navigationAction.targetFrame.isMainFrame) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
UIDelegate
যেহেতু এই পদ্ধতিতে ঘোষিত হয়, সম্পত্তি WKUIDelegate
না WKNavigationDelegate
।
@ ক্লাউড জু এর উত্তর সঠিক উত্তর। কেবল রেফারেন্সের জন্য, এটি সুইফটে রয়েছে:
// 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)
}
return nil
}
সুইফট ৪.২+ এর সর্বশেষতম সংস্করণ ব্যবহার করতে
import WebKit
সঙ্গে আপনার ক্লাস প্রসারিত করুন ডব্লিউকেইউইলেগেট
ওয়েবভিউয়ের জন্য প্রতিনিধি সেট করুন
self.webView.uiDelegate = self
প্রোটোকল পদ্ধতি প্রয়োগ করুন
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame == nil {
webView.load(navigationAction.request)
}
return nil
}
নিজেকে ডাব্লু কে নেভিগেশনডেলিগেট হিসাবে যুক্ত করুন
_webView.navigationDelegate = self;
এবং প্রতিনিধি কলব্যাক সিদ্ধান্তে নীচের কোডটি বাস্তবায়ন করুন পলিসি ফর নেভিগেশনঅ্যাকশন: সিদ্ধান্তহ্যান্ডার:
- (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 Beta
if (!navigationAction.targetFrame) {
NSURL *url = navigationAction.request.URL;
UIApplication *app = [UIApplication sharedApplication];
if ([app canOpenURL:url]) {
[app openURL:url];
}
}
decisionHandler(WKNavigationActionPolicyAllow);
}
পিএস: এই কোডটি আমার সামান্য প্রকল্পের STKWebKitViewController
, যা ডাব্লুউইউবিউভিউয়ের চারপাশে একটি ব্যবহারযোগ্য ইউআইকে আবৃত করে।
window.open(url, "_blank")
আপনি যদি ইতিমধ্যে WKWebView.navicationDelegate সেট করে থাকেন
WKWebView.navicationDelegate = স্ব;
আপনার কেবল প্রয়োগ করা দরকার:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
BOOL shouldLoad = [self shouldStartLoadWithRequest:navigationAction.request]; // check the url if necessary
if (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);
}
এইভাবে আপনার ডাব্লু কেইউডিলেট পদ্ধতি কার্যকর করতে হবে না।
এই সমাধানগুলির কোনওটিই আমার পক্ষে কাজ করেনি, আমি সমস্যাটি এর দ্বারা সমাধান করেছি:
1) ডব্লিউকেইউইলেগেট বাস্তবায়ন করা
@interface ViewController () <WKNavigationDelegate, WKUIDelegate>
2) ডাব্লুউইউবিউউয়ের ইউআইডিলেগেট প্রতিনিধি নির্ধারণ করা
self.wkWebview.UIDelegate = self;
3) createWebViewWithConfigration পদ্ধতি প্রয়োগ করা
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
if (!navigationAction.targetFrame.isMainFrame) {
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[[UIApplication sharedApplication] openURL:[navigationAction.request URL]];
}
return nil; }
Cloud xu
এর উত্তর আমার সমস্যা সমাধান করে।
যদি কারও সমতুল্য সুইফ্ট (4.x / 5.0) সংস্করণটির প্রয়োজন হয় তবে তা এখানে:
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if let frame = navigationAction.targetFrame,
frame.isMainFrame {
return nil
}
// for _blank target or non-mainFrame target
webView.load(navigationAction.request)
return nil
}
অবশ্যই আপনাকে webView.uiDelegate
প্রথমে সেট করতে হবে ।
আমি নিশ্চিত করেছি যে বিল ওয়েইম্যানের সুইফট কোডটি সঠিক is তবে এটি উল্লেখ করা দরকার যে এটির কাজ করার জন্য আপনাকে ইউআইডিলেগেটও প্রেরণ করতে হবে, আপনি যদি আমার মতো বিকাশের আইওএসে নতুন হন।
এটার মতো কিছু:
self.webView?.UIDelegate = self
সুতরাং তিনটি স্থান রয়েছে যা আপনার পরিবর্তন করতে হবে।
self.webView.UIDelegate = self
ViewController
আপনাকে উত্তরাধিকারী হওয়া দরকার WKUIDelegate
। যেমনclass ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate
আপনি অন্য ভিউ কন্ট্রোলারটিকে চাপ দিতে পারেন, বা একটি নতুন ট্যাব ইত্যাদি খুলতে পারেন:
func webView(webView: WKWebView, createWebViewWithConfiguration configuration: WKWebViewConfiguration, forNavigationAction navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
var wv: WKWebView?
if navigationAction.targetFrame == nil {
if let vc = self.storyboard?.instantiateViewControllerWithIdentifier("ViewController") as? ViewController {
vc.url = navigationAction.request.URL
vc.webConfig = configuration
wv = vc.view as? WKWebView
self.navigationController?.pushViewController(vc, animated: true)
}
}
return wv
}
vc.url
? আমি এটি সেট করছি না, এবং ওয়েব ভিউটি সঠিকভাবে লোড হচ্ছে। এছাড়াও, আমার অভিজ্ঞতা আমি শুধু দেখছি createWebViewWithConfiguration
নামক যখন navigationAction.targetFrame
হয় nil
। আপনি কি এমন দৃশ্যের বর্ণনা দিতে পারবেন যেখানে এটি সত্য হবে না?
অ্যালেন হুয়াং উত্তরের ভিত্তিতে
target=“_blank”
push
ওয়েবউইউ সহ কন্ট্রোলারটি দেখুন যদি বর্তমান কন্ট্রোলার থাকে navigationController
present
অন্যান্য সমস্ত ক্ষেত্রে ওয়েবভিউ সহ কন্ট্রোলার দেখুনwebView.uiDelegate = self
// .....
extension ViewController: WKUIDelegate {
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
guard navigationAction.targetFrame == nil,
let url = navigationAction.request.url else { return nil }
let vc = ViewController(url: url, configuration: configuration)
if let navigationController = navigationController {
navigationController.pushViewController(vc, animated: false)
return vc.webView
}
present(vc, animated: true, completion: nil)
return nil
}
}
Info.plist
আপনার তথ্য.প্লেস্ট পরিবহন সুরক্ষা সেটিংসে যোগ করুন
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
ViewController
import UIKit
import WebKit
class ViewController: UIViewController {
private lazy var url = URL(string: "https://www.w3schools.com/html/tryit.asp?filename=tryhtml_links_target")!
private weak var webView: WKWebView!
init (url: URL, configuration: WKWebViewConfiguration) {
super.init(nibName: nil, bundle: nil)
self.url = url
navigationItem.title = ""
}
required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
override func viewDidLoad() {
super.viewDidLoad()
initWebView()
webView.loadPage(address: url)
}
private func initWebView() {
let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
view.addSubview(webView)
self.webView = webView
webView.navigationDelegate = self
webView.uiDelegate = self
webView.translatesAutoresizingMaskIntoConstraints = false
webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
}
}
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
guard let host = webView.url?.host else { return }
navigationItem.title = host
}
}
extension ViewController: WKUIDelegate {
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
guard navigationAction.targetFrame == nil,
let url = navigationAction.request.url else { return nil }
let vc = ViewController(url: url, configuration: configuration)
if let navigationController = navigationController {
navigationController.pushViewController(vc, animated: false)
return vc.webView
}
present(vc, animated: true, completion: nil)
return nil
}
}
extension WKWebView {
func loadPage(address url: URL) { load(URLRequest(url: url)) }
func loadPage(address urlString: String) {
guard let url = URL(string: urlString) else { return }
loadPage(address: url)
}
}
সংস্করণ 1
সংস্করণ 2
এটি আমার পক্ষে কাজ করেছে:
-(WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
if (!navigationAction.targetFrame.isMainFrame) {
WKWebView *newWebview = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];
newWebview.UIDelegate = self;
newWebview.navigationDelegate = self;
[newWebview loadRequest:navigationAction.request];
self.view = newWebview;
return newWebview;
}
return nil;
}
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
decisionHandler(WKNavigationActionPolicyAllow);
}
- (void)webViewDidClose:(WKWebView *)webView {
self.view = self.webView;
}
যেমন আপনি দেখতে পাচ্ছেন, আমরা এখানে যা করছি তা কেবলমাত্র webView
নতুন ইউআরএল দিয়ে একটি নতুন খোলার এবং বন্ধ হওয়ার সম্ভাবনাকে নিয়ন্ত্রণ করছে, কেবলমাত্র যদি second webview
প্রথমে প্রদর্শিত হওয়ার জন্য আপনার কাছ থেকে প্রতিক্রিয়া প্রয়োজন ।
আমি এমন কিছু সমস্যার মুখোমুখি হয়েছি যা কেবল ব্যবহার করে সমাধান করা যায় না webView.load(navigationAction.request)
। তাই আমি এটি করতে একটি নতুন ওয়েবভিউ তৈরি করতে ব্যবহার করি এবং এটি ঠিক কাজ করে।
//MARK:- WKUIDelegate
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
NSLog(#function)
if navigationAction.targetFrame == nil {
NSLog("=> Create a new webView")
let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
webView.uiDelegate = self
webView.navigationDelegate = self
self.webView = webView
return webView
}
return nil
}
**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
}
**In View Did Load:**
if webView == nil { initWebView(configuration: WKWebViewConfiguration()) }
webView?.load(url: url1)
**WKUIDelegate Method 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))")
if let url = navigationAction.request.url, navigationAction.targetFrame == nil {
let viewController = WebViewController()
viewController.initWebView(configuration: configuration)
viewController.url1 = url
DispatchQueue.main.async { [weak self] in
self?.navigationController?.pushViewController(viewController, animated: true)
}
return viewController.webView
}
return nil
}
}
extension WKWebView
{
func load(url: URL) { load(URLRequest(url: url)) }
}