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

本文探讨了iOS应用中JavaScript与原生代码交互的两种主要方式:JavaScriptCore和WebViewJavaScriptBridge,分析了它们的使用场景、优缺点及实现细节,为开发者选择合适的交互方案提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS原生与JS交互的几种方式对比
 JavaScriptCore 
  第三方框架
WebViewJavaScriptBridge
WKWebView
简介

iOS7之后苹果推出了

JavaScriptCore这个框架,

从而让web页面和本地原应用

交互起来非常方便

而且使用此框架可以

Android那边和iOS相对统一,

web前端写一套代码

就可以适配客户端的两个台,

从而减少了web前端的工作量。

基于拦截协议进行的封装,
学习成本相对JavaScriptCore较高,
使用不如JavaScriptCore方便.

关于JS交互,使用

https://github.com/marcuswestin/WebViewJavascriptBridge

支持UIWebViewWKWebView

并且在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之后推出的。所以要判断一下系统的版本,否则可能会导致程序崩溃


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值