JS的简单交互(web代理)
2016-01-12 15:19
771 查看
首先,今天写的JS交互要感谢-- 宇神(向晨宇)给写的的demo 共我们学习
JS交互在我的理解中把他分为了--简洁版 与 --动态版
简洁版:就是今天要写的根据获取Web的代理获取"NSURLRequest"后,转化为字符串,进行比较后调用相应地方法。
动态版:JSPatch中实现了通过 Runtime 接口调用和替换 OC 方法,从而得到实时的方法。至于为什么不写这个动态版的,主要是因为JSPatch的链接中已经写了很多了:JSPatch实现原理详解,还有一个小原因是。。司小文的脑袋真的不够使...看个大概还行,往深里看再写出来就不成了。(好吧确实这个才是主要的)。
那接下来咱们依然代码加注释,赶紧写完赶紧去浪。
首先,这个交互需要后台和你配合,定义出一个你们共同的暗号。(比如 xxx 或者 SiXiaoWenBangBangDa
这样的)
这个给后台看:
这个才是给你的呦:(内容可以由你的需要改变但是要保证根据和web页定好的规矩来,不然有可能会出问题)
当然了除了JSCallOC的方法,我们也有OC呼叫JS的方法这个也需要后台来帮你完成,function showTitle() --- 看上面给后台的这个方法
我们现在用OC的方法来呼叫,非常简单 因为系统已经集成在了 web方法里
如果有任何问题欢迎留言在评论或者私戳我,JS交互这只是最简单地冰山一角,一起来玩吧。
感谢观看,学以致用更感谢。
JS交互在我的理解中把他分为了--简洁版 与 --动态版
简洁版:就是今天要写的根据获取Web的代理获取"NSURLRequest"后,转化为字符串,进行比较后调用相应地方法。
动态版:JSPatch中实现了通过 Runtime 接口调用和替换 OC 方法,从而得到实时的方法。至于为什么不写这个动态版的,主要是因为JSPatch的链接中已经写了很多了:JSPatch实现原理详解,还有一个小原因是。。司小文的脑袋真的不够使...看个大概还行,往深里看再写出来就不成了。(好吧确实这个才是主要的)。
那接下来咱们依然代码加注释,赶紧写完赶紧去浪。
首先,这个交互需要后台和你配合,定义出一个你们共同的暗号。(比如 xxx 或者 SiXiaoWenBangBangDa
这样的)
这个给后台看:
<html> <!--描述网页信息--> <head> <meta charset="UTF-8"/> <title>iOS上webView与JS交互的demo</title> <script> function show() { alert('你调用了show->1'); } function showTitle() { alert(document.title); } function showTitleMessage(message) { alert(message); } function repost() { location.href = "http://www.iosxxx.com"; } function sum() { return 1 + 1; } function btnClick() { <!--xmg://sendMessageWithNumber_andContent_?10086&love--> location.href = "xmg://callWithNumber_?15830654880"; } </script> </head> <!--网页具体内容--> <body> <br>电话号码: 11111111</br> <br>邮箱: xcysuccess@qq.com</br><br/> <button style = "background: red; height: 150px; width: 150px;" onclick = "btnClick();">按钮</button> </body> </html>
这个才是给你的呦:(内容可以由你的需要改变但是要保证根据和web页定好的规矩来,不然有可能会出问题)
#pragma mark-JSCallOC - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { //打印看下URL NSLog(@"%@", request.URL); //这个@"xmg://"就是和后台定的暗号 NSString *schem = @"xmg://"; //把NSURLRequest转换成字符串的形式 NSString *urlStr = [request.URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //判断暗号是否一样,一样的话进入我们需要调用OC方法 if ([urlStr hasPrefix:schem]) { // 1.从URL中获取方法名称 (去除"xmg://callWithNumber_?15830654880"中的@"xmg://") // 此时 subPath = callWithNumber_?15830654880; NSString *subPath = [urlStr substringFromIndex:schem.length]; // 注意: 如果指定的用于切割的字符串不存在, 那么就会返回整个字符串 // 切割字符串获得数组中元素:callWithNumber_ 与 15830654880; NSArray *subPaths = [subPath componentsSeparatedByString:@"?"]; // 2.获取方法名称--数组中首元素callWithNumber_为方法名 // 把方法名中的_换成冒号 NSString *methodName = [subPaths firstObject]; methodName = [methodName stringByReplacingOccurrencesOfString:@"_" withString:@":"]; // 3.调用方法 // 讲方法名生成一个方法sel SEL sel = NSSelectorFromString(methodName); // 4.处理参数 NSString *parma = nil; if (subPaths.count == 2) { //获取数组中的最后一个元素为电话15830654880 parma = [subPaths lastObject]; // 3.截取参数 (保险起见如果有&去除调) NSArray *parmas = [parma componentsSeparatedByString:@"&"]; #pragma clang diagnostic ignored "-Warc-performSelector-leaks" //去通过刚才生成的方法sel(callWithNumber:) 传入参数电话15830654880 由self调用 //- (void)callWithNumber:(NSString *)numbe [self performSelector:sel withObject:[parmas firstObject] withObject:[parmas lastObject]]; #pragma clang diagnostic pop return NO; } //这里处理参数很麻烦,我们可以自己实现一个类去将苹果自带的方法进行优化,其实就是可以传递不同的参数(多个)去处理相应的事件 [self performSelector:sel withObject:parma]; return NO; } return YES; } // callWithNumber: - (void)callWithNumber:(NSString *)number{ NSLog(@"打电话给%@", number); [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showTitleMessage('%@')", number]]; }
当然了除了JSCallOC的方法,我们也有OC呼叫JS的方法这个也需要后台来帮你完成,function showTitle() --- 看上面给后台的这个方法
我们现在用OC的方法来呼叫,非常简单 因为系统已经集成在了 web方法里
#pragma mark-ocCallJS -(void) ocCallJS { [self.webView stringByEvaluatingJavaScriptFromString:@"showTitle();"]; }
如果有任何问题欢迎留言在评论或者私戳我,JS交互这只是最简单地冰山一角,一起来玩吧。
感谢观看,学以致用更感谢。
相关文章推荐
- JS实现图片延迟加载(lazyload改编)
- Chrome调试js出现Uncaught SyntaxError: Unexpected identifier
- JavaScript函数定义方式
- ajax 对 Json 格式的解析
- 几个JavaScript的浏览器差异处理问题
- js-实现双向链表
- JavaScript 闭包
- ExtJS 5.1 TabReorderer plugin
- JavaScript进阶(六)用JavaScript读取和保存文件
- JavaScript进阶(六)用JavaScript读取和保存文件
- js函数的参数深析
- jsp 设置ie兼容
- 野生Js技术之字符画视频
- web中jsp获取工程路径方法
- 基于JavaScript实现div层跟随滚动条滑动
- json的各类转换总结
- JS实现选中文件后自动上传功能
- 原生js 操作表格 增删行和列
- ECharts JavaScript图表库 ECharts
- 浏览器环境下JavaScript脚本加载与执行探析之代码执行顺序