OC与js交互


在iOS开发中,Objective-C(OC)和JavaScript(JS)之间的交互是常见需求,尤其是在混合式应用开发中。`stringByEvaluatingJavaScriptFromString`方法是Apple提供的一个关键工具,用于实现在原生OC代码中执行JavaScript代码,从而实现两者之间的通信。下面将详细介绍这个方法的使用以及OC与JS交互的基础知识。 ### `stringByEvaluatingJavaScriptFromString` 方法 这个方法是`UIWebView`类的一个实例方法,其定义如下: ```objc - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script; ``` 它接收一个`NSString`类型的参数,即要执行的JavaScript代码,并返回执行结果的字符串。这个方法使得我们可以在OC中动态地调用网页中的JavaScript函数,获取网页的数据或者控制网页的行为。 ### OC 调用 JS 以下是一个简单的示例,展示如何使用`stringByEvaluatingJavaScriptFromString`在OC中调用JS函数: ```objc UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; [self.view addSubview:webView]; // 加载包含JS函数的HTML页面 NSString *htmlString = @"<!DOCTYPE html><html><body><script>function sayHello(){return 'Hello from JavaScript!';}</script></body></html>"; [webView loadHTMLString:htmlString baseURL:nil]; // 在页面加载完成后调用JS函数 [webView stringByEvaluatingJavaScriptFromString:@"sayHello()"]; // 返回 "Hello from JavaScript!" ``` 在这个例子中,我们首先创建了一个`UIWebView`,然后加载了一个包含`sayHello`函数的HTML页面。当页面加载完成后,我们通过`stringByEvaluatingJavaScriptFromString`调用了这个JS函数,并得到了返回的结果。 ### JS 调用 OC 为了使JS能够调用OC的方法,我们需要实现`UIWebViewDelegate`协议中的`webView:didFinishLoadForRequest:`方法,并使用`addScriptMessageHandlerForName:handler:`方法注册一个消息处理器: ```objc webView.delegate = self; // 注册消息处理器 [webView addScriptMessageHandler:self name:@"callNative"]; // UIWebViewDelegate方法 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { // 此时可以安全地执行JS代码 [webView evaluateJavaScript:@"window.callNative('Hello from JavaScript!');" completionHandler:^(id _Nullable result, NSError * _Nullable error) { if (!error) { NSLog(@"Received message from JS: %@", result); } }]; } ``` 同时,我们需要实现`WKScriptMessageHandler`协议,处理来自JS的消息: ```objc - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.name isEqualToString:@"callNative"]) { NSLog(@"Called from JS: %@", message.body); // 在这里你可以响应JS的调用并执行相应的OC代码 } } ``` ### 注意事项 1. **安全性**:由于JS可以直接访问OC对象,因此需要确保只暴露必要的方法,避免安全风险。 2. **异步**:JS调用OC是异步的,因此在处理JS消息时需要注意线程安全。 3. **性能**:频繁的交互可能影响性能,优化交互逻辑以减少不必要的通信。 `stringByEvaluatingJavaScriptFromString`是连接OC和JS的关键桥梁,通过它我们可以实现丰富的交互功能。无论是为了获取网页数据、控制页面行为还是响应用户操作,这个方法都扮演着不可或缺的角色。在实际项目中,根据需求合理运用这些技术,可以提高用户体验并降低开发难度。


































































- 1


- 粉丝: 196
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于python编写的appium自动化框架,采用PO模式,并集成了日志以及测试报告通过邮件发送的功能.zip
- 基于Python的ATM和购物商城的联合应用,商品结算调用ATM接口.zip
- 基于Python并调用百度智能云API所实现的简单人脸对比.zip
- 基于Python编写的中国城市轨道交通数据可视化分析项目。应用技术:网络编程、多线程、文件操作、数据库编程、GUI界面、数据分析。Python课程设计、大作业、实验、实践.zip
- 基于python的bilibili网页登录二维码输出到控制台的小工具.zip
- 基于python的discuz!论坛签到脚本.zip
- 基于python的django框架写的学生信息管理系统.zip
- 基于Python的Django模型,利用Bootstrap3前端框架,实现常用的基本功能,如增删改查、批量删除以及分页等,数据库使用Django自带的轻量级SQLite.zip
- 基于python的dtw算法,实现实时语音识别。.zip
- 基于Python的flask框架的疫情可视化网站.zip
- 基于python的linux系统资源监控,包括磁盘,cpu,内存,进程监控。通过钉钉群发送告警.zip
- 基于Python的NuitkaGUI.zip
- 基于python的PLUMED的可视化界面开发.zip
- 基于Python的flask网络爬虫web项目.zip
- 基于Python的numpy实现的简易深度学习框架,包括自动求导、优化器、layer等的实现。.zip
- 基于python的socket的Udp链接,模拟路灯.zip


