2017-06-29 14 views
0

Facebookのアプリの動作を複製したいと思います。外部リンクをクリックすると、新しいブラウザで開きます(Safariには表示されません)。外部リンクをWkWebViewから新しいWKWebviewに開く

現在、私のWebサイトを読み込むWKWebViewがあります。私はクリックイベントでユーザーを捕まえて開き、Safariで言うことができます。私は今、

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

} 

問題は、それが構築されていても、ときに私は、外部リンクをクリックして、ということです...、代わりのSafariで開くと、新しいWKWebViewを作成し、そこにそのリンクを表示したいですアプリがクラッシュします。

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? 
関連する問題