在 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 问题的主要内容,如果未能解决你的问题,请参考以下文章
当 navigationController 弹出时,iOS WKWebView 在 ios 8 和 ios 9 上崩溃
iOS 9 WKWebView 产生“加载资源失败:已取消”,而 iOS 8 没有