偶遇WKWebView不執行代理的一種坑

weixin_34007886發表於2016-10-11

背景

1. 通過<圖1>方式建立WKWebView。

2. @interface實現過<WKNavigationDelegate, WKUIDelegate>。

3. @property (nonatomic, strong) WKWebView *webView;

1506700-597c80b3964d10b4.png
<圖1>

現象: WKWebViewW的代理都不執行,正確的場合、錯誤的場合都沒有任何列印。

// 頁面開始載入時呼叫

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;

// 當內容開始返回時呼叫

- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;

// 頁面載入完成之後呼叫

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;

// 頁面載入失敗時呼叫

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;


經過逐個模組註釋的方式找到了原因, 發現在<圖1>程式碼之後有用到WebViewJavascriptBridge,程式碼如下:

1506700-c8bd20c3b4df4d27.png
<圖2>

這個第三方的主要用途是完成原生APP與JS之間的互動。

 如上寫法就是會把之前設定self.webView的代理給清除掉。原因:

<圖2>的程式碼寫在了程式碼【webView.UIDelegate = self;  webView.navigationDelegate = self; 】之後。而且建立WebViewJavascriptBridge沒有使用<圖3>。


WebViewJavascriptBridge提供了同時設定代理和回撥的方法如<圖3>:

1506700-a23abb332a7efc7f.png
<圖3>

你只有在這個方法裡設定代理,代理才會真正的生效。但是如果<圖2>的程式碼寫在程式碼【webView.UIDelegate = self;    webView.navigationDelegate = self;】之前代理就不會被清除,但是這樣會影響WebViewJavascriptBridge的使用。

我這邊是把<圖2>程式碼更改為上邊這個方法,問題解決。

思考

1. 在開發iOS APP的時候,我們會使用大量的第三方,在使用第三方的時候,考慮到第三方程式碼對原生程式碼的影響尤其重要。

2. 當我們遇到一些莫名其妙的問題時,一定要保持冷靜,最差也可以用模組註釋的方式排查問題。

相關文章