iOS开发小知识之WebViewJavascriptBridge 与 NJKWebViewProgress 导致的冲突解决

黄正浩
2023-12-01

iOS开发中 WebViewJavascriptBridgeNJKWebViewProgress 都是与UIWebView相关的两个优秀的第三方库,WebViewJavascriptBridge 可以帮助iOS客户端与web端完成操作的交互,NJKWebViewProgress可以在webView加载时显示加载的进度,但这两个第三方同时使用就会产生冲突。

具体表现为创建代码的先后顺序,如果先创建WebViewJavascriptBridgeNJKWebViewProgress作用就会消失,显示不出来进度条,如果先集成NJKWebViewProgress那么WebViewJavascriptBridge的作用就会消失,前端就无法调用客户端本地的方法。 造成这个冲突的原因是因为UIWebViewdelegete 被置换了,delegate 在ARC下都是week ,所以当你指定了NJKWebViewProgressdelegate,然后又指定 了WebViewJavascriptBridgedelegate,两次交替,最终只会一个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];
复制代码

转载于:https://juejin.im/post/5b5c0e8f6fb9a04fc34c1d4d

 类似资料: