JavaScriptCore |
第三方框架
WebViewJavaScriptBridge
| WKWebView | |
---|---|---|---|
简介 |
从而让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端如何使用 分四步(官方demo中都有相关代码) |
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参数问题 等等... 参考:WKWebView 那些坑: https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA |
注意事项 | 注意:NativeApisProtocol协议中定义的方法是在子线程中执行的,如果在所定义的方法中需要修改界面或者跳转之类的,需要通过GCD回主线程操作。 |
1.VC销毁时,移除交互对象; 如果不移除交互对象,则导致 交互对象内存常驻而引起内存泄漏 [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"funcName"]; 2.WKWebView是在ios8.0之后推出的,但是清理缓存的功能是在ios9.0之后推出的。所以要判断一下系统的版本,否则可能会导致程序崩溃 |
iOS开发--iOS原生与JS交互的几种方式对比
最新推荐文章于 2025-03-29 08:21:13 发布