2016-03-26 12 views
17

में कुछ डोमेन से खुले लिंक देखें मेरे आईओएस ऐप के साथ कुछ मदद की तलाश है। मेरे ऐप के भीतर मैं WKWebView में अपने डोमेन (EX: communionchapelefca.org) के भीतर क्लिक किए गए लिंक खोलना चाहता हूं और उसके बाद सफारी में सभी अन्य डोमेन (EX: google.com) से लिंक हैं। मैं इस प्रोग्राम को भी पसंद करना पसंद करूंगा क्योंकि इस तरह मेरा कोड पहले ही सेटअप हो चुका है।WKWebView Safari

मैं stackoverflow पर कुछ समाधान मिल गया है (here, here, here, और here) लेकिन वे सभी Obj सी आधारित है और मैं एक समाधान स्विफ्ट का उपयोग कर रहा हूँ होने लगते हैं। अग्रिम में धन्यवाद।

ViewController.swift:

func loadURLString(str: String) { 
    guard let url = NSURL(string: str) else { 
     return 
    } 

    if url.host == "www.communionchapelefca.org" { 
     // Open in myWebView 
     myWebView.loadRequest(NSURLRequest(URL: url)) 
    } else { 
     // Open in Safari 
     UIApplication.sharedApplication().openURL(url) 
    } 
} 

उपयोग::

loadURLString("http://www.communionchapelefca.org/app-home") // Open in myWebView 
loadURLString("http://www.apple.com") // Open in Safari 

उत्तर

34

आप WKNavigationDelegate लागू कर सकते हैं, decidePolicyForNavigationAction जोड़ने

import UIKit 
import WebKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let myWebView:WKWebView = WKWebView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height)) 

     myWebView.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.communionchapelefca.org/app-home")!)) 

     self.view.addSubview(myWebView) 
+1

धन्यवाद! आपके कोड ने मेरी समस्या हल की! –

+1

ने अभी सुधार किया है; धन्यवाद फिर से –

+0

@ ग्रेगविल्लियम्स आपका स्वागत है –

1

जहां URL लोड करने में तय करने के लिए एक समारोह बनाओ विधि और नेविगेशन टाइप करें और यूआरएल का अनुरोध किया। मैं नीचे google.com का इस्तेमाल किया है, लेकिन आप केवल अपने डोमेन के लिए इसे बदल सकते हैं:

Xcode 8.3 • स्विफ्ट 3,1

import UIKit 
import WebKit 
class ViewController: UIViewController, WKNavigationDelegate { 
    let webView = WKWebView() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     guard let url = URL(string: "https://www.google.com") else { return } 
     webView.frame = view.bounds 
     webView.navigationDelegate = self 
     webView.load(URLRequest(url: url)) 
     webView.autoresizingMask = [.flexibleWidth,.flexibleHeight] 
     view.addSubview(webView) 
    } 
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { 
     if navigationAction.navigationType == .linkActivated { 
      if let url = navigationAction.request.url, 
       let host = url.host, !host.hasPrefix("www.google.com"), 
       UIApplication.shared.canOpenURL(url) { 
       UIApplication.shared.open(url) 
       print(url) 
       print("Redirected to browser. No need to open it locally") 
       decisionHandler(.cancel) 
      } else { 
       print("Open it locally") 
       decisionHandler(.allow) 
      } 
     } else { 
      print("not a user click") 
      decisionHandler(.allow) 
     } 
    } 
} 
+0

खेद यह मेरे इतने लंबे समय आप लेकिन अपने कोड फ्लॉप काम जब साथ वापस पाने के लिए ले लिया मैं अपने वेबव्यू के भीतर एक बाहरी लिंक पर क्लिक करता हूं, यह अभी भी इसे वेबव्यू में खोलता है। –

6

स्विफ्ट 3.0 के लिए

import UIKit 
import WebKit 

class ViewController: UIViewController, WKNavigationDelegate { 
    let wv = WKWebView(frame: UIScreen.main.bounds) 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     guard let url = NSURL(string: "https://www.google.com") else { return } 
     wv.navigationDelegate = self 
     wv.load(NSURLRequest(url: url as URL) as URLRequest) 
     view.addSubview(wv) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { 
     if navigationAction.navigationType == .LinkActivated { 
      if let newURL = navigationAction.request.url, 
       let host = newURL.host , !host.hasPrefix("www.google.com") && 
       UIApplication.shared.canOpenURL(newURL) && 
       UIApplication.shared.openURL(newURL) { 
        print(newURL) 
        print("Redirected to browser. No need to open it locally") 
        decisionHandler(.cancel) 
      } else { 
       print("Open it locally") 
       decisionHandler(.allow) 
      } 
     } else { 
      print("not a user click") 
      decisionHandler(.allow) 
     } 
    } 
} 
3

यहाँ से नमूना कोड है obj सी में लिखा तेजी से प्रतिक्रिया।

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler 
{ 
    if (navigationAction.navigationType == WKNavigationTypeLinkActivated) { 
     if (navigationAction.request.URL) { 
      NSLog(@"%@", navigationAction.request.URL.host); 
      if (![navigationAction.request.URL.resourceSpecifier containsString:@"ex path"]) { 
       if ([[UIApplication sharedApplication] canOpenURL:navigationAction.request.URL]) { 
        [[UIApplication sharedApplication] openURL:navigationAction.request.URL]; 
        decisionHandler(WKNavigationActionPolicyCancel); 
       } 
      } else { 
       decisionHandler(WKNavigationActionPolicyAllow); 
      } 
     } 
    } else { 
     decisionHandler(WKNavigationActionPolicyAllow); 
    } 
} 
1

मेरे तेज 3 समाधान:

public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { 

     let url = navigationAction.request.url 

     if url?.description.lowercased().range(of: "http://") != nil || url?.description.lowercased().range(of: "https://") != nil { 
      decisionHandler(.cancel) 
      UIApplication.shared.openURL(url!) 
     } else { 
      decisionHandler(.allow) 
     } 

    } 

सेटअप ते प्रतिनिधि को भी मत भूलना

public override func loadView() { 
     let webConfiguration = WKWebViewConfiguration() 
     webView = WKWebView(frame: .zero, configuration: webConfiguration) 
     webView.uiDelegate = self 
     webView.navigationDelegate = self 
     view = webView 
    } 
संबंधित मुद्दे