2017-06-29 68 views
0

我想複製Facebook應用程序的行爲,當你點擊一個外部鏈接時,它會在新瀏覽器中打開(但它不在Safari中)。從WkWebView打開外部鏈接到一個新的WKWebview

我目前有一個WKWebView加載我的網站。我可以通過單擊事件捕獲用戶並打開它們,比方說在Safari中。我現在想,而不是在Safari中打開它們,創建一個新的WKWebView,並顯示該鏈接有...

import UIKit 
import Darwin 
import SafariServices 
import WebKit 

class ViewController: UIViewController, UIWebViewDelegate, SFSafariViewControllerDelegate, WKNavigationDelegate { 

let url = "http://myurl:3000" 
var webView : WKWebView! 
var webView2 : WKWebView! 

@IBOutlet weak var progressView: UIProgressView! 
var myTimer = Timer() 
var theBool: Bool = false 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let url = URL(string: self.url)! 
    webView.load(URLRequest(url: url) as URLRequest) 
    webView.allowsBackForwardNavigationGestures = true 
} 

override func loadView() { 
    webView = WKWebView() 
    webView.navigationDelegate = self 
    view = webView 
} 

func webViewDidFinishLoad(_ webView: UIWebView) { 
    theBool = true; 
} 

func webViewDidStartLoad(_ webView: UIWebView) { 
    myTimer = Timer.scheduledTimer(timeInterval: 0.06, target: self, selector: #selector(ViewController.updateTimer), userInfo: nil, repeats: true) 
    theBool = false; 
    progressView.progress = 0.0 
} 

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { 
    if navigationAction.navigationType == .linkActivated { 
      webView2 = WKWebView() 
      webView2.navigationDelegate = self 
      view = webView2 
      let url = navigationAction.request.url 
      webView2.load(URLRequest(url: url!) as URLRequest) 

    } else { 
     print("not a user click") 
     decisionHandler(.allow) 
    } 
} 

func updateTimer() 
{ 
    if (theBool) { 
     if (progressView.progress >= 1) { 
      progressView.isHidden = true; 
      myTimer.invalidate() 
     } 
     else { 
      progressView.progress += 0.1; 
     } 
    } 
    else { 

     if (progressView.isHidden){ 
      progressView.isHidden = false 
     } 
     progressView.progress += 0.05; 
     if (progressView.progress >= 0.60) { 
      progressView.progress = 0.60; 
     } 
    } 
} 

} 

的問題是,即使它是建築,當我點擊外部鏈接,該應用程序崩潰。

libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

+0

在webView2.load調用後,decisionHandler(.cancel)丟失。請檢查 –

回答

0

我建議你實現這個WKUIDelegate方法,並加載這個方法裏面新WKWebView的URL。

optional func webView(_ webView: WKWebView, 
createWebViewWith configuration: WKWebViewConfiguration, 
       for navigationAction: WKNavigationAction, 
    windowFeatures: WKWindowFeatures) -> WKWebView?