背景:
1. 通過(guò)<圖1>方式創(chuàng)建WKWebView。
2. @interface實(shí)現(xiàn)過(guò)<WKNavigationDelegate, WKUIDelegate>。
3. @property (nonatomic, strong) WKWebView *webView;

現(xiàn)象: WKWebViewW的代理都不執(zhí)行,正確的場(chǎng)合、錯(cuò)誤的場(chǎng)合都沒(méi)有任何打印。
// 頁(yè)面開(kāi)始加載時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// 當(dāng)內(nèi)容開(kāi)始返回時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 頁(yè)面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 頁(yè)面加載失敗時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
經(jīng)過(guò)逐個(gè)模塊注釋的方式找到了原因, 發(fā)現(xiàn)在<圖1>代碼之后有用到WebViewJavascriptBridge,代碼如下:

這個(gè)第三方的主要用途是完成原生APP與JS之間的交互。
?如上寫(xiě)法就是會(huì)把之前設(shè)置self.webView的代理給清除掉。原因:
<圖2>的代碼寫(xiě)在了代碼【webView.UIDelegate = self;? webView.navigationDelegate = self; 】之后。而且創(chuàng)建WebViewJavascriptBridge沒(méi)有使用<圖3>。
WebViewJavascriptBridge提供了同時(shí)設(shè)置代理和回調(diào)的方法如<圖3>:

你只有在這個(gè)方法里設(shè)置代理,代理才會(huì)真正的生效。但是如果<圖2>的代碼寫(xiě)在代碼【webView.UIDelegate = self;? ? webView.navigationDelegate = self;】之前代理就不會(huì)被清除,但是這樣會(huì)影響WebViewJavascriptBridge的使用。
我這邊是把<圖2>代碼更改為上邊這個(gè)方法,問(wèn)題解決。
思考:
1. 在開(kāi)發(fā)iOS APP的時(shí)候,我們會(huì)使用大量的第三方,在使用第三方的時(shí)候,考慮到第三方代碼對(duì)原生代碼的影響尤其重要。
2. 當(dāng)我們遇到一些莫名其妙的問(wèn)題時(shí),一定要保持冷靜,最差也可以用模塊注釋的方式排查問(wèn)題。