偶遇WKWebView不执行代理的一种坑
背景:
1. 通过<图1>方式创建WKWebView。
2. @interface实现过<WKNavigationDelegate, WKUIDelegate>。
3. @property (nonatomic, strong) WKWebView *webView;
<图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,代码如下:
<图2>这个第三方的主要用途是完成原生APP与JS之间的交互。
如上写法就是会把之前设置self.webView的代理给清除掉。原因:
<图2>的代码写在了代码【webView.UIDelegate = self; webView.navigationDelegate = self; 】之后。而且创建WebViewJavascriptBridge没有使用<图3>。
WebViewJavascriptBridge提供了同时设置代理和回调的方法如<图3>:
<图3>你只有在这个方法里设置代理,代理才会真正的生效。但是如果<图2>的代码写在代码【webView.UIDelegate = self; webView.navigationDelegate = self;】之前代理就不会被清除,但是这样会影响WebViewJavascriptBridge的使用。
我这边是把<图2>代码更改为上边这个方法,问题解决。
思考:
1. 在开发iOS APP的时候,我们会使用大量的第三方,在使用第三方的时候,考虑到第三方代码对原生代码的影响尤其重要。
2. 当我们遇到一些莫名其妙的问题时,一定要保持冷静,最差也可以用模块注释的方式排查问题。