在 iOS 9 中遇到 WKWebview 和 UIWebView 问题

Having trouble with WKWebview and UIWebView in iOS 9

我对此感到非常沮丧,希望遇到过类似问题的任何人都能提供帮助。当前项目使用 Swift 2、iOS9 和 XCode 7.2。我有 ViewConroller 并尝试添加 UIWebView 或 WKWebview 作为子视图,但是,UIWebView 使应用程序崩溃,而我的 WKWebview 未加载 URL,并且 none 的 WKNavigationDelegate 方法被调用。

  1. 首先尝试使用 UIWebView,应用程序在 UIWebView 使用框架初始化的那一行崩溃,错误 'EXC_BAD_ACCESS'。如果我在 nib 中添加 webview,则在尝试以相同的错误呈现此 viewcrontroller 时整个应用程序崩溃。

``

import UIKit
import WebKit

class TestViewController: UIViewController, UIWebViewDelegate {
    @IBOutlet weak var placeholderView: UIView!
    override func viewDidLoad() {
    super.viewDidLoad()
    let webV:UIWebView = UIWebView(frame: CGRectMake(0, 0, placeholderView.bounds.width, placeholderView.bounds.height))
    webV.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.com")))
    webV.delegate = self;
    self.view.addSubview(webV)
    }
}

``

  1. 改为使用 WKWebview,这解决了崩溃问题,但是,它只显示空白视图,并且 none 的 WKNavigationDelegate 方法被调用

``

import UIKit
import WebKit

class TestViewController: UIViewController, WKNavigationDelegate {
    @IBOutlet weak var placeholderView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let preferences = WKPreferences()
        preferences.javaScriptEnabled = false
        let webcon = WKWebViewConfiguration()
        webcon.preferences = preferences
        let webView: WKWebView = WKWebView(frame: CGRectMake(0, 0, placeholderView.bounds.width, placeholderView.bounds.height), configuration: webcon)
        webView.navigationDelegate = self
        let url = NSURL(string: "https://www.google.com")!
        placeholderView.addSubview(webView)
        placeholderView.bringSubviewToFront(webView)
        webView.loadRequest(NSURLRequest(URL: url))

    }
    func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        NSLog("Webview started Loading")
    }
    func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
        NSLog("%@", navigationAction.request.URL!)
    }

    func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
        print("\nWebview did finish load \(webView.request)", terminator: "")
    }
}

``

我已经将 WebKit 导入到框架工作中,添加的应用程序允许任意加载到我的 info.plist。

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

UIWebView 崩溃的原因几乎可以肯定是因为 delegate 设置了一个不存在的对象。

我猜 WKWebView 委托方法没有被调用是因为你没有设置 navigationDelegate 属性 (或者你设置了,但是你设置它的对象已被释放。)

嗯,尝试更改您的 webView 声明.. 首先在您的 class 中通过 var webView: WKWebView 声明您的 webView(不要使用 let),然后将 self.webView = WKWebView(frame: CGRectMake(0, 0, placeholderView.bounds.width, placeholderView.bounds.height), configuration: webcon) 在 vi​​ewDidLoad()