iOS与js相互调用
在iOS开发中,Objective-C(OC)和JavaScript(JS)之间的交互是常见需求,尤其是在混合式应用开发中。本文将详细讲解如何实现OC调用JS方法以及JS调用OC方法,帮助开发者理解这一核心技术。 ## OC调用JS方法 ### 1. UIWebView 在早期的iOS开发中,UIWebView是实现OC与JS交互的主要方式。你需要创建一个UIWebView实例,并加载HTML内容。当UIWebView加载完成时,可以使用`evaluateJavaScript:`方法来执行JavaScript代码: ```objc UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; [webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]]]]; [webView evaluateJavaScript:@"yourJavaScriptFunction();" completionHandler:^(id _Nullable result, NSError * _Nullable error) { if (!error) { NSLog(@"JavaScript function executed successfully"); } else { NSLog(@"Error executing JavaScript: %@", error.localizedDescription); } }]; ``` ### 2. WKWebView 随着iOS的发展,WKWebView逐渐取代了UIWebView,因为它提供了更好的性能和安全特性。调用JS方法的步骤类似,但需要使用`evaluateJavaScript:`的异步方法: ```objc WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:[WKWebViewConfiguration new]]; NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]]; WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration]; [webView loadRequest:[NSURLRequest requestWithURL:url]]; [webView evaluateJavaScript:@"yourJavaScriptFunction();" completionHandler:^(id _Nullable result, NSError * _Nullable error) { if (!error) { NSLog(@"JavaScript function executed successfully"); } else { NSLog(@"Error executing JavaScript: %@", error.localizedDescription); } }]; ``` ## JS调用OC方法 ### 1. UIWebView 在UIWebView中,可以定义一个`UIWebViewDelegate`协议的方法来监听JavaScript的`window.location`改变,通过添加自定义的URL Scheme来调用OC方法: ```objc @interface ViewController () <UIWebViewDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; webView.delegate = self; } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if ([request.URL.scheme isEqualToString:@"myapp"]) { NSString *jsMethod = request.URL.host; // 执行对应的OC方法 return NO; // 阻止页面加载 } return YES; // 其他链接正常处理 } @end ``` ### 2. WKWebView WKWebView提供了`WKUserContentController`来实现JS和OC的交互。首先创建一个WKUserContentController,设置用户脚本,然后将其添加到WKWebView的配置中: ```objc WKUserContentController *userContentController = [[WKUserContentController alloc] init]; [userContentController addScriptMessageHandler:self name:@"callFromJS"]; WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; configuration.userContentController = userContentController; WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration]; ``` 接下来,实现`WKScriptMessageHandler`协议,处理来自JavaScript的消息: ```objc - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.name isEqualToString:@"callFromJS"]) { NSString *jsMethod = message.body; // 执行对应的OC方法 } } ``` JS端可以通过`window.webkit.messageHandlers.callFromJS.postMessage`来发送消息: ```javascript window.webkit.messageHandlers.callFromJS.postMessage("Your method to call in OC"); ``` 总结起来,无论是OC调用JS还是JS调用OC,都需要对iOS的Web视图组件有深入理解。UIWebView和WKWebView提供了不同的实现方式,但原理都是通过通信机制实现两者间的交互。随着技术发展,建议使用更现代的WKWebView以获得更好的性能和安全体验。
- 1
- 粉丝: 21
- 资源: 36
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 最新版新UI包天付费视频打赏程序 带包天+可扣量+代理+多模板非云赏V系列
- YOLO算法-检测驾驶员侧车窗是否关闭数据集-564张图像带标签-车窗关闭-汽车-车窗打开.zip
- YOLO算法-下水管道缺陷检测数据集-980张图像带标签-关节偏移-障碍物-裂纹-带扣-洞-公用设施入侵-碎片.zip
- YOLO算法-刀器数据集-610张图像带标签-刀.zip
- YOLO算法-办公室椅子数据集-876张图像带标签.zip
- YOLO算法-绵羊检测数据集-574张图像带标签-羊.zip
- YOLO算法-包装好的服装数据集-654张图像带标签-.zip
- YOLO算法-警车检测数据集-676张图像带标签-.zip
- YOLO算法-垃圾箱检测数据集-1228张图像带标签-垃圾桶.zip
- YOLO算法-刀具检测数据集-300张图像带标签-.zip
- G120 EPOS基本定位功能关键点系列-堆垛机报F7452追踪原因.mp4
- YOLO算法-罐头和瓶子数据集-595张图像带标签.zip
- YOLO算法-回收站数据集-501张图像带标签-黑色垃圾箱-绿色垃圾桶-箱子-杯子-老鼠-蓝色垃圾桶.zip
- 2015年10月及2016年4月全国高等教育自学考试试题及答案02325
- YOLO算法-刀数据集-830张图像带标签-刀.zip
- YOLO算法-雨水排放涵洞模型数据集-1000张图像带标签-.zip