OC与JS的交互
来源:互联网 发布:linux ubuntu 服务器版 编辑:程序博客网 时间:2024/05/17 01:14
1、在iOS项目开发中,原生页面中掺杂Html5页面已不是什么新鲜事了,毕竟H5也他相关的优势,比如布局、富文本内容展示等;2、随着H5页面的侵入,OC与JS的交互意愿越来越强烈,就目前来看,在不引用第三方库的前提下,有两种方式可以解决;2.1、iOS6及以前通过拦截NSRequest请求来调用原生方法进行交互;2.2、iOS7及以后的版本苹果官方引入了JavaScriptCore框架;3、拦截NSRequest请求A、UIwebView有个代理方法:
// Objective-C 语言
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
NSURL * url = [request URL];
if ([[url scheme] isEqualToString:@"gap"]) {
// 在这里做 js 调 native 的事情
// ....
// 做完之后用如下方法调回 js
[webView stringByEvaluatingJavaScriptFromString:@"alert('done')"];
return NO;
}
return YES;
}
B、此方法通过返回YES/NO来决定是否跳转到request的页面,因此我们可以通过协议头来区分是正常的URL请求还是本地方法的调用请求;C、比如说网页中某a标签请求的地址是 saap://share,那么在该代理方法中就可以通过url的协议头来将其拦截,返回NO,页面不跳转,同时执行某个share方法,即达到了调用OC本地方法的效果;D、参数可以通过url中带过来,或者参数内容过长可以通过post请求,在request的HTTPBody中可以将post请求内容解析出来E、现在调OC方法没问题了,OC如何调用页面中的方法呢?其实UIWebView给我们也提供了一个交互方法
- (
NSString
*)stringByEvaluatingJavaScriptFromString:(
NSString
*)script;
4、JavaScriptCore框架
4.1、在iOS7及以后的版本中可以通过官方提供的JS框架来进行交互,主要涉及到的两个类是JSValue、JSContext
4.2、JSContext指的是JS的上下文,即可以简单解理成<script></script>标签部分;
4.3、JSValue是一个在OC和JS之间进行数据转换的类,他可以将JS对象或数据转换成OC的对象或数据,反之亦然;
4.4、如何使用呢,又分为两种方式,一种方式通过Block(即所谓的匿名函数),另一种方法即通过代理,这是苹果的一惯作风!
5、两种方法的对比
5.1、Block的基本实现方式:
A、在UIWebView的代理方法- (void)webViewDidFinishLoad:(UIWebView *)webView加入以下代码
- (
void
)webViewDidFinishLoad:(UIWebView *)webView
{
JSContext *context = [
self
.webView valueForKeyPath:
@"documentView.webView.mainFrame.javaScriptContext"
];
context[
@"ocShow"
] = ^(){
NSLog
(
@"来自JS的问候..."
);
};
// 模拟JS调用
[context evaluateScript:
@"ocShow()"
];
}
网页中如果JS调用ocShow()方法,即会输入这行"来自JS的问候...";
C、一种方法是在这个Block中添加参数:^(NSString *str1, NSString *str2){},如果对Block不熟悉可以参考http://www.yusian.com/thread-976-1-1.html 或者网上找下相关资料看看先;
D、另外一种方法,通过JSContext的类方法currentArguments可以获取NSArray *argument = [JSContext currentArguments]; 然后遍历获得;
E、这种方法使用简单方便,但每次都要重新写,可不可以指向我已有的现成方法?当然是可以的!使用代理
5.2、通过代理实现
A、自定义一个协议,继承自<JSExport>,把JS需要调用的方法在该协议中申明;
B、但凡遵循<JSExport>协议的对象都可以被JS所调用
C、实现相关方法即可
#import "ViewController.h"
#import <JavaScriptCore/JavaScriptCore.h>
@protocol
SAJSExport <JSExport>
- (
void
)showMessage:(JSValue *)message;
@end
@interface
ViewController () <UIWebViewDelegate, SAJSExport>
@property
(
nonatomic
, strong) UIWebView *webView;
@end
@implementation
ViewController
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
self
.webView = [[UIWebView alloc] init];
self
.webView.delegate =
self
;
self
.webView.frame =
self
.view.bounds;
[
self
.view addSubview:
self
.webView];
NSURL
*url = [
NSURL
URLWithString:
@"http://www.yusian.com"
];
[
self
.webView loadRequest:[
NSURLRequest
requestWithURL:url]];
}
- (
void
)webViewDidFinishLoad:(UIWebView *)webView
{
JSContext *context = [
self
.webView valueForKeyPath:
@"documentView.webView.mainFrame.javaScriptContext"
];
// 1、Block方法
context[
@"ocShow"
] = ^(){
NSLog
(
@"来自JS的问候..."
);
};
// 模拟JS调用
[context evaluateScript:
@"ocShow()"
];
// 2、代理方法
[context setObject:
self
forKeyedSubscript:
@"webView"
];
// 模拟JS调用webView.showMessage()方法
[context evaluateScript:
@"webView.showMessage('Hello JavaScript')"
];
}
- (
void
)showMessage:(JSValue *)message
{
[[[UIAlertView alloc] initWithTitle:
nil
message:[message toString] delegate:
nil
cancelButtonTitle:
@"朕知道了"
otherButtonTitles:
nil
,
nil
] show];
}
- OC与JS的交互
- JS与OC的交互
- OC与JS的交互
- JS 与 OC 的 交互
- oc与js 交互
- oc与js交互
- JS与OC交互
- js与oc 交互
- OC与JS交互
- OC与JS交互
- OC与JS交互
- OC与JS交互
- OC 与JS 交互
- OC与JS交互
- oc 与 js 交互
- OC与JS交互
- OC与JS交互
- oc与js交互
- IOS学习笔记一
- Android学习中一些零散的知识点
- 创建调试信息文件失败
- listen和accept函数解析
- 创建个人网站(二) 网站备案
- OC与JS的交互
- [前端 4] 使用Js实现图片上传预览
- 低功耗蓝牙(BLE)之概念理解
- 20. 静态区块(Static Blocks)
- 编写串口通信的要注意的地方
- 38.IO流
- C++作业3
- IOS 触摸事件
- 194. Transpose File