博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript与Objective-C之间的通信
阅读量:4987 次
发布时间:2019-06-12

本文共 2425 字,大约阅读时间需要 8 分钟。

之前自己闲着无聊写过几个套用网页的“皮包软件”,其实像这样的“皮包软件”也可以做得很高端大气的,通过WebKit实现的OC-JS Bridge,可以非常方便的实现在JS中调用OC的方法/在OC中调用JS的方法。如此一来,便可以通过web实现炫丽的UI,而通过原生API实现与本地相关的操作。

1、JS中变量在OC中的类型

通过OC-JS Bridge,变量的类型会自动进行转换,基本类型都会自动转换,如JS中的number、boolean都会转换成OC中的NSNumber类型,而String类型会自动转换成NSString类型,JS中的对象会转换成WebScriptObject对象,而相关的属性信息可以通过Key-Value的方法读取和写入,本文后面可看到相关的代码。

2、实现在OC中调用JS方法

在OC中调用JS方法是非常方便的,WebView有一个windowScriptObject属性,可以直接获得脚本对象,然后便可以调用callWebScriptMethod:withArguments将消息转发给JS中对象的方法和参数,对于简单的方法调用你也可以直接通过WebView的方法stringByEvaluatingJavaScriptFromString去执行一段JS代码,并返回字符串。示例代码:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//在OC中的调用 - (void)ocAction:(id)sender {
NSArray *args = @[@"Hello,JS!"]; id result = [[webView windowScriptObject] callWebScriptMethod:@"JSFunction" withArguments:args]; NSLog(@"%@",result); } //在JS中对应的方法 function JSFunction(parameter) { //显示OC返回的值 alert(parameter); //返回成功的消息 return 'Web程序已经收到消息!'; }

3、实现JS调用OC的方法

通过设置webView的frameLoadDelegate,在– webView:didClearWindowObject:forFrame:回调方法中,指定一个本地对象(该对象实现WebScripting协议),然后JS中就可以直接调用该对象的相关方法。
OC中的代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
//该方法用于JS中调用 - (WebScriptObject *)status:(WebScriptObject *)jsObject {
//将JS发过来的信息显示出来 NSString *message = [jsObject valueForKey:@"message"]; NSLog(@"%@",message); //返回成功的信息(WebScriptObject对象不能自己创建,所以此处复用了传入的参数) [jsObject setValue:@"本地端已经收到消息啦!" forKey:@"message"]; return jsObject; } #pragma mark - #pragma mark WebFrameLoadDelegate //通过此回调,将self传递给JS环境 - (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame { [windowObject setValue:self forKey:@"native"]; } #pragma mark - #pragma mark WebScriptingProtocol /* 返回是否阻止响应该方法, 返回NO即能响应该方法 */ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector { if (selector == @selector(status:)) { return NO; } return YES; } /* 返回本地方法在JS中的名称(不实现此方法,则JS中方法名与OC中相同) */ + (NSString *)webScriptNameForSelector:(SEL)sel { if (sel == @selector(status:)) { return @"ocMethod"; } return nil; }

JS中代码如下:

1 2 3 4 5 6 7 8 9 10 11 12
function CallNative() { if (native) { //将消息组装成对象发给OC var parameter = { 'message':'Hello,Objective-C!'}; var result = native.ocMethod(parameter); //显示OC返回的结果 alert(result['message']); } }

相关的示例代码可以参见Apple的CallJS这个Demo,也可以直接下载我写的Demo:

转载于:https://www.cnblogs.com/xiao-love-meng/p/5757615.html

你可能感兴趣的文章
四则运算C++带Qt界面版本,吾王镇楼。。。。。
查看>>
安卓7.0手机拍照闪退问题解决
查看>>
ME525+ Defy+ 刷机指南[zz]
查看>>
支持触屏的jQuery轮播图插件
查看>>
差一点搞混了Transactional注解
查看>>
javascript基本函数
查看>>
前端公共库cdn服务推荐//提高加载速度/节省流量
查看>>
asp.net GridView多行表头的实现,合并表头
查看>>
C#套打
查看>>
PolyCluster: Minimum Fragment Disagreement Clustering for Polyploid Phasing 多聚类:用于多倍体的最小碎片不一致聚类...
查看>>
【每日进步】July 2012
查看>>
${sessionScope.user}的使用方法
查看>>
WCF开发框架形成之旅---结合代码生成工具实现快速开发
查看>>
Spring事务管理
查看>>
linux下mysql配置文件my.cnf详解
查看>>
08ssm三大框架整合以前步骤
查看>>
R语言学习笔记之八
查看>>
主动与被动监控 拓扑图组合图 自定义监控
查看>>
SQL总结(一)基本查询
查看>>
PDF分割--可脱离python环境执行,可传参数,可弹窗的PC端小工具
查看>>