2016-03-26 9 views
17

Cerchi aiuto con la mia app iOS. All'interno della mia app voglio aprire i collegamenti cliccati dal mio dominio (EX: communionchapelefca.org) in WKWebView e quindi avere i link da tutti gli altri domini (EX: google.com) aperti in Safari. Preferirei farlo anche progrmaticamente poiché è così che il mio codice è già configurato.WKWebView apre collegamenti da determinati domini in safari

ho trovato alcune soluzioni su StackOverflow (here, here, here, e here) ma tutti sembrano essere Obj-C basa e sto cercando una soluzione utilizzando Swift. Grazie in anticipo.

ViewController.swift:

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) 

risposta

34

È possibile implementare WKNavigationDelegate, aggiungere il decidePolicyForNavigationAction metodo e controllare lì il navigationType e l'URL richiesto. Ho usato google.com in basso, ma si può solo cambiare per il dominio:

Xcode 8.3 • Swift 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) 
     } 
    } 
} 
+1

grazie! il tuo codice ha risolto il mio problema! –

+1

appena fatto la correzione; grazie ancora –

+0

@GregWilliams siete i benvenuti –

1

Fare una funzione per decidere dove caricare l'URL:

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) 
    } 
} 

Usage:

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

spiace c'è voluto così tanto tempo per tornare con voi, ma il vostro lavoro il codice non ha ancora quando clicco su un link esterno nella mia webview, lo apre comunque in webview. –

6

per SWIFT 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

Ecco il codice di esempio da la risposta alla rapida scritta in obj c.

- (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

mio swift 3 soluzione:

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) 
     } 

    } 

Non dimenticare anche di impostare te delegato

public override func loadView() { 
     let webConfiguration = WKWebViewConfiguration() 
     webView = WKWebView(frame: .zero, configuration: webConfiguration) 
     webView.uiDelegate = self 
     webView.navigationDelegate = self 
     view = webView 
    }