偶遇WKWebView不执行代理的一种坑

背景

1. 通过<图1>方式创建WKWebView。

2. @interface实现过

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

偶遇WKWebView不执行代理的一种坑_第1张图片
<图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. 当我们遇到一些莫名其妙的问题时,一定要保持冷静,最差也可以用模块注释的方式排查问题。

你可能感兴趣的:(偶遇WKWebView不执行代理的一种坑)