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];