iOS开发中 WebViewJavascriptBridge 与 NJKWebViewProgress 都是与UIWebView
相关的两个优秀的第三方库,WebViewJavascriptBridge
可以帮助iOS客户端与web端完成操作的交互,NJKWebViewProgress
可以在webView
加载时显示加载的进度,但这两个第三方同时使用就会产生冲突。
具体表现为创建代码的先后顺序,如果先创建WebViewJavascriptBridge
那NJKWebViewProgress
作用就会消失,显示不出来进度条,如果先集成NJKWebViewProgress
那么WebViewJavascriptBridge
的作用就会消失,前端就无法调用客户端本地的方法。 造成这个冲突的原因是因为UIWebView
的delegete
被置换了,delegate
在ARC下都是week
,所以当你指定了NJKWebViewProgress
的delegate
,然后又指定 了WebViewJavascriptBridge
的delegate
,两次交替,最终只会一个delegate
会生效
我目前的解决方法为先创建 WebViewJavascriptBridge
然后再创建 NJKWebViewProgress
但是设置 NJKWebViewProgress
对象的代理时 设置为刚刚创建的WebViewJavascriptBridge
对象, 主要是webViewProgress.webViewProxyDelegate = self.jsBridge
这一句。如果设置为webViewProgress.webViewProxyDelegate = self
就会出现上面的问题。
代码:
self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds]
[self.view addSubview:self.webView];
[WebViewJavascriptBridge enableLogging];
self.jsBridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
[self.jsBridge setWebViewDelegate:self];
[self JavaScriptCallObjectiveC];
webViewProgress = [[NJKWebViewProgress alloc] init];
self.webView.delegate = webViewProgress;
webViewProgress.webViewProxyDelegate = self.jsBridge;
webViewProgress.progressDelegate = self;
webViewProgressView = [[NJKWebViewProgressView alloc] init];
webViewProgressView.frame = CGRectMake(0, 64, SCREEN_WIDTH, 2);
webViewProgressView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
[webViewProgressView setProgress:0 animated:YES];
[self.view addSubview:webViewProgressView];
复制代码