在 iOS 9 中遇到 WKWebview 和 UIWebView 问题

Posted

技术标签:

【中文标题】在 iOS 9 中遇到 WKWebview 和 UIWebView 问题【英文标题】:Having trouble with WKWebview and UIWebView in iOS 9 【发布时间】:2016-02-14 23:37:16 【问题描述】:

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

    首先尝试使用UIWebView,应用程序崩溃UIWebView init with frame,错误'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)
    

``

    改用 WKWebview,这解决了崩溃问题,但是,它只显示一个空白视图,并且没有调用任何 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 属性(或者你做了,但是你设置它的对象被释放了。) 天啊,没关系,非常感谢,太愚蠢了,但很高兴我问了。 @AaronBrager 【参考方案1】:

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

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

【讨论】:

我在 API 调用之后从另一个视图呈现这个视图,在 Aaron 的提示之后,我意识到出了什么问题,修复是在第一个 VC 中,添加 [weak self] 和 strongself。还是谢谢【参考方案2】:

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

【讨论】:

以上是关于在 iOS 9 中遇到 WKWebview 和 UIWebView 问题的主要内容,如果未能解决你的问题,请参考以下文章

[iOS]使用WKWebView遇到的问题总结

当 navigationController 弹出时,iOS WKWebView 在 ios 8 和 ios 9 上崩溃

iOS 9 WKWebView 产生“加载资源失败:已取消”,而 iOS 8 没有

【iOS】WKWebView使用Cookies遇到的坑

WKWebView 视口缩小以适应在 iOS 9.3 上不起作用

为啥我在 iOS 9 上的 WKWebView 中的音频流无法播放?