iOS7之后JavaScript与Objective-C之间的通信
http://www.cocoachina.com/ios/20150906/13320.html
最近公司用Ping++集成了第三方支付,并且微信端也集成了这个功能,而微信付款时需要调用原生的支付宝支付或者微信支付,由此引出了JS调用OC方法的问题。
Js -> Native
以前传统的做法是根据url字符串来做特殊匹配,从而完成一些特定的工作譬如
1
2
3
4
5
6
7
8
9
10
11
12
|
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *requestString = [[request URL] absoluteString]; NSString *scheme = @ "js-pingpp" ; NSString *protocol = [NSString stringWithFormat:@ "%@://" , scheme]; if ([requestString hasPrefix:protocol]) { //调用相应支付Api /*do something*/ return NO; } return YES; } |
但是iOS7之后, iOS 7 引入了 JavaScriptCore 库,它把 WebKit 的 JavaScript 引擎用 Objective-C 封装,让JavaScript与Objective-C之间的通信变的非常简单。首先导入JavaScriptCore.framework框架, 然后
JS端:
1
|
TXBB_IOS_SDK.callPay(charge, this .success, this .cancel); |
OC端:
.h中引入头文件,并实现协议和对应的方法
.m中在webViewDidFinishLoad中给context赋值,并把self指针给TXBB_IOS_SDK,JS端即可经过TXBB_IOS_SDK.callPay调用起Native方法
1
2
3
4
5
6
7
8
9
10
11
12
|
-(void)webViewDidFinishLoad:(UIWebView *)webView { self.context = [webView valueForKeyPath:@ "documentView.webView.mainFrame.javaScriptContext" ]; self.context[@ "TXBB_IOS_SDK" ] = self; } #pragma mark - JSExport Methods - (void)callPay:(NSString *)charge success:(NSString *) success cancel:(NSString *)cancel { ... [Pingpp createPayment:charge appURLScheme:@ "msc" withCompletion:completion]; } |
Native -> Js
OC端调用JS代码则只需通过context调用evaluateScript方法即可,下列代码即会用JS显示Hello World,而在iOS7.0之前你可能通过[webView stringByEvaluatingJavaScriptFromString:@"document.title"]方法来获取WebView的title。
1
2
3
4
5
6
|
-(void)webViewDidFinishLoad:(UIWebView *)webView { JSContext *context=[webView valueForKeyPath:@ "documentView.webView.mainFrame.javaScriptContext" ]; NSString *alertJs=@ "alert('Hello Word')" ; [context evaluateScript:alertJs]; } |
最后
JS和OC通信还有个非常著名的第三方库WebViewJavascriptBridge,如果你的项目需要支持iOS6之前的系统,你可以通过这个项目实现JS和OC的通信。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具