iOS原生与JS交互

iOS原生与JS交互的几种方式对比

第三方框架 WebViewJavaScriptBridge WKWebView
简介 iOS7之后苹果推出了JavaScriptCore这个框架,从而让web页面和本地原生应用交互起来非常方便,而且使用此框架可以做到Android那边和iOS相对统一,web前端写一套代码就可以适配客户端的两个平台,从而减少了web前端的工作量。 基于拦截协议进行的封装,学习成本相对JavaScriptCore较高,使用不如JavaScriptCore方便.关于JS交互,使用https://github.com/marcuswestin/WebViewJavascriptBridge支持UIWebView与WKWebView,并且在Android有一套对应的https://github.com/lzyzsd/JsBridge,前端只需要写一套。 iOS8之后出现的。功能更强大它与UIWebView相比较,拥有更快的加载速度和性能,更低的内存占用。
交互 在ObjC中通过JSContext注入模型,然后调用模型的方法。(项目一般用该方式)第一步:需要声明一个与JS进行交互的协议(NativeApisProtocol),要求该协议遵守JSExport协议。第二步:新建一个模型(NativeAPIs),要求该模型遵守NativeApisProtocol协议。一般而言,需要在NativeAPIs模型中声明一个JSContext属性,便于与JS交互。第三步:实现该模型(NativeAPIs),即在NativeAPIs.m文件中实现NativeApisProtocol协议中定义的方法。第四步:在ViewController.m的-webViewDidFinishLoad:方法中获取当前JS执行环境(self.jsContext),然后将NativeAPIs模型注入到JS执行环境。 JS端如何使用· 第一步:将一段固定代码放在JS中· 第二步:在固定的方法体里写相关JS代码,通过bridge.callHandler来调用iOS端 WKWebView和JavaScript交互1.导入WKUserContentController.h这个头文件2.创建WKWebView的时候添加交互对象3.并让交互对象实现WKScriptMessageHandler中的唯一的一个代理方法。 JavaScript调用Objective-C的时候,使用window.webkit.messageHandlers.funcName.postMessage(需要传递的参数);而Objective-C在回调JavaScript的时候,要么执行一段JavaScript代码,或者就是调用JavaScript那边的暴露的一个全局函数。一般是采用后者
缺点 在-webViewDidFinishLoad:方法中注入NativeAPIs模型存在一定的问题,因为这时候网页还没加载完,JavaScript若开始调用Objective-C代码(即NativeApisProtocol协议中定义的方法),会出现调用不到方法的问题。 解决方法:在每次创建JSContext环境的时候,都注入NativeAPIs模型到JSContext环境中。更加具体的方法可以参考第三方库UIWebView-TS_JavaScriptContext。通过引入UIWebView+TS_JavaScriptContext,让ViewController遵守TSWebViewDelegate协议,实现代理协议中的方法-webView:didCreateJavaScriptContext:,以此获取JSContext环境。 使用这个库有什么缺点?最明显的就是要固定加入相关代码,而且JS代码要放在固定的函数内添加。那么安卓端是否也支持这样呢?如果不支持,那么H5端要分别判断ios、安卓?究竟是否通用。 WKWebView 使用的 WebKit 框架,交互时为 webkit.messageHandlers 注入对象,前端H5需要做判断两种不同注入方式带来的不同调用方式· WKWebView的请求不能被NSURLProtocol截获。· Cookie问题: WKWebView Cookie 问题在于 WKWebView 发起的请求不会自动带上存储于 NSHTTPCookieStorage 容器中的 Cookie 不允许跨域· 无法发送POST参数问题,dealloc后异步执行js crash
注意 注意:NativeApisProtocol协议中定义的方法是在子线程中执行的,如果在所定义的方法中需要修改界面或者跳转之类的,需要通过GCD回主线程操作。 1.VC销毁时,移除交互对象;如果不移除交互对象,则导致交互对象内存常驻而引起内存泄漏 [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"funcName"]; 2.WKWebView是在ios8.0之后推出的,但是清理缓存的功能是在ios9.0之后推出的。所以要判断一下系统的版本,否则可能会导致程序崩溃

你可能感兴趣的:(iOS原生与JS交互)