最近,项目要用到js交互的功能,看了些资料。整理下自己学到的东西。
主要方向是 (1)、通过webview的delegate来做js交互;(2)、如果最低的sdk是7.0以上,可以使用JavaScriptCore 苹果自带的框架来做js交互。JavaScript的操作更高效
1、webview的delegate来做js 交互
通过 (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 代理方法可以知道网页中的每一个请求,通过请求的URL来判断 。关于这个代理方法 bool: NO 表示不执行默认操作、YES 执行默认操作。下面一个简单例子
// webview js调用OC
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
// 这个方法是网页中的每一个请求都会被触发的
NSString *requestString = [[[requestURL] absoluteString]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSArray *components = [requestStringcomponentsSeparatedByString:@"::"];
if (components != nil && [componentscount] > 0){
NSString *pocotol = [components objectAtIndex:0];
if ([pocotol isEqualToString:@"testapp"]) {
NSString *messageStr = [componentsobjectAtIndex:1];
NSArray *messageArray = [messageStrcomponentsSeparatedByString:@":"];
if (messageArray != nil && [messageArraycount] > 0) {
NSString *key = [messageArray objectAtIndex:0];
NSString *value = [[messageArray objectAtIndex:1]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if ([key isEqualToString:@"alert"]) {
UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"消息"message:value delegate:nilcancelButtonTitle:@"OK"otherButtonTitles: nil];
[alertshow];
}
}
return NO;
}
}
return YES;
}
注:跟JS那边约定的规范 协议名称::方法名:param1=value1¶m2=value2… //XX是协议名,command是命令名,后面是参数表(0或多个,command后的冒号不可省略)
// webview 注入JS代码
[self.jsWebViewstringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');"
"script.type = 'text/javascript';"
"script.text = \"function getMessageFromApp('xxxx') { "
"var testDiv = document.getElementById('testDiv');"
"testDiv.innerText = message;"
"}\";"
"document.getElementsByTagName('head')[0].appendChild(script);"];
[self.jsWebViewstringByEvaluatingJavaScriptFromString:@"getMessageFromApp('xxxx');"];
2、JavaScriptCore的简单实使用
//首先创建JSContext对象(此处通过当前webView的键获取到jscontext)
self.jsContext=[webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// javaScriptCore框架 JS调用OC
self.jsContext[@"sendCommand"] = ^(NSString *alert,NSString *message) {
UIAlertView *alertView = [[UIAlertViewalloc]initWithTitle:alertmessage:message delegate:nilcancelButtonTitle:@"OK"otherButtonTitles: nil];
[alertViewshow];
};
// javaScriptCore 注入JS代码
[self.jsContext[@"getMessageFromApp"]callWithArguments:@[[NSNumbernumberWithInteger:self.number++]]];
注: (1)、javascriptcore 通过 block 来对应js方法,block的参数就是对应js方法的参数;在block里面需要注意循环引用的问题(2)、 javaScriptCore 注入JS代码通过callWithArguments来传参数给js方法、如果传入多个参数、js只有一个参数、默认取数组第一个
这里说的是一些简单的使用,希望可以对刚接触这一块的朋友们有帮助。我理解的不对,还望指正,谢谢~~