码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发——网络开发OC篇&OC与JS交互简单案例

时间:2015-08-25 21:23:23      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

OC与JS交互简单案例




网页开发中三个重要的知识,这里就不详细介绍了!

  • Html:页面代码
  • Css:样式
  • javascript:响应


先来看一段html的简单代码,里面涉及了上面的三个部分(很简单)

 1 <html>
 2     <!--描述网页信息-->
 3     <head>
 4         <meta charset="UTF-8"/>
 5         <title>hello world</title>
 6         <script>
 7             function show()
 8             {
 9                 alert(1);
10             }
11             function showTitle()
12             {
13                 alert(document.title);
14             }
15             function repost()
16             {
17                 location.href = "http://www.520it.com";
18             }
19             function sum()
20             {
21                 eturn 1 + 1;
22             }
23             function btnClick()
24             {
25                 location.href = "xmg://call";
26             }
27         </script>
28     </head>
29     <!--网页具体内容-->
30     <body>
31         电话号码: 13554499311</br>
32         邮箱: 97606813@qq.com</br>
33         <button style = "background: red; height: 150px; width: 150px;" onclick = "btnClick();">哥是按钮</button>
34     </body>
35 
36 </html>

根据上面的代码,我可以简单的实现JS和OC的交互

1:在OC中调用JS

这里非常简单,一行代码就搞定

只需要在网页加载完成之后的方法webViewDidFinishLoad中使用交互代码实现OC中直接调用JS代码,并且制定对应的JS函数

     OC调用JS , 只需要利用UIWebView的stringByEvaluatingJavaScriptFromString方法, 告诉系统需要调用的JS方法名称即可

    [self.webView  stringByEvaluatingJavaScriptFromString:@"showTitle();"];

 


2:JS中调用OC代码

根据上面的代码,我在body中实现简单的样式布局和交互的初始化,然后实现交互的函数,在函数里面使用location.href(非常重要)去调用OC代码。

后面要做的就是在OC中实现请求加载的时候去处理相应的功能,其实就是在OC中为JS调用OC构建桥梁

这里知识简单的实现:


  • 每次发送请求前都会调用
  • 利用该方法作为JS和OC之间的桥梁
  •  在JS跳转网页
  •  在OC代理方法中通过判断自定义协议头, 决定是否是JS调用OC方法
  • 在OC代理方法中通过截取字符串, 获取JS想调用的OC方法名称

 

  1 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
  2 
  3 {
  4 
  5     NSLog(@"%@", request.URL);
  6 
  7     /*
  8 
  9     NSString *schem = @"xmg://";
 10 
 11     NSString *urlStr = request.URL.absoluteString;
 12 
 13     if ([urlStr hasPrefix:schem]) {
 14 
 15         NSLog(@"需要调用OC方法");
 16 
 17         // 1.从URL中获取方法名称
 18 
 19         // xmg://call
 20 
 21         NSString *methodName = [urlStr substringFromIndex:schem.length];
 22 
 23         NSLog(@"%@", methodName);
 24 
 25         // 2.调用方法
 26 
 27         SEL sel = NSSelectorFromString(methodName);
 28 
 29         // 忽略警告信息的作用范围开始
 30 
 31 #pragma clang diagnostic push
 32 
 33         // 下面这一行代码是用于指定需要忽略的警告信息
 34 
 35 #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
 36 
 37         [self performSelector:sel withObject:nil];
 38 
 39         // 忽略警告信息的作用范围结束
 40 
 41 #pragma clang diagnostic pop
 42 
 43         return NO;
 44 
 45     }
 46 
 47      */
 48 
 49     /*
 50 
 51     NSString *schem = @"xmg://";
 52 
 53     NSString *urlStr = request.URL.absoluteString;
 54 
 55     if ([urlStr hasPrefix:schem]) {
 56 
 57         NSLog(@"需要调用OC方法");
 58 
 59         // 1.从URL中获取方法名称
 60 
 61         // xmg://callWithNumber_?10086
 62 
 63         NSString *subPath = [urlStr substringFromIndex:schem.length];
 64 
 65         // 注意: 如果指定的用于切割的字符串不存在, 那么就会返回整个字符串
 66 
 67         NSArray *subPaths = [subPath componentsSeparatedByString:@"?"];
 68 
 69         // 2.获取方法名称
 70 
 71         NSString *methodName = [subPaths firstObject];
 72 
 73         methodName = [methodName stringByReplacingOccurrencesOfString:@"_" withString:@":"];
 74 
 75         NSLog(@"%@", methodName);
 76 
 77         // 2.调用方法
 78 
 79         SEL sel = NSSelectorFromString(methodName);
 80 
 81         NSString *parmas = nil;
 82 
 83         if (subPaths.count == 2) {
 84 
 85             parmas = [subPaths lastObject];
 86 
 87         }
 88 
 89         [self performSelector:sel withObject:parmas];
 90 
 91         return NO;
 92 
 93     }
 94 
 95      */
 96 
 97     NSString *schem = @"xmg://";
 98 
 99     NSString *urlStr = request.URL.absoluteString;
100 
101     if ([urlStr hasPrefix:schem]) {
102 
103         NSLog(@"需要调用OC方法");
104 
105         // 1.从URL中获取方法名称
106 
107         // xmg://sendMessageWithNumber_andContent_?10086&love
108 
109         NSString *subPath = [urlStr substringFromIndex:schem.length];
110 
111         // 注意: 如果指定的用于切割的字符串不存在, 那么就会返回整个字符串
112 
113         NSArray *subPaths = [subPath componentsSeparatedByString:@"?"];
114 
115         // 2.获取方法名称
116 
117         NSString *methodName = [subPaths firstObject];
118 
119         methodName = [methodName stringByReplacingOccurrencesOfString:@"_" withString:@":"];
120 
121         NSLog(@"%@", methodName);
122 
123         // 2.调用方法
124 
125         SEL sel = NSSelectorFromString(methodName);
126 
127 
128 
129         // 3.处理参数
130 
131         NSString *parma = nil;
132 
133         if (subPaths.count == 2) {
134 
135             parma = [subPaths lastObject];
136 
137             // 3.截取参数
138 
139             NSArray *parmas = [parma componentsSeparatedByString:@"&"];
140 
141             [self performSelector:sel withObject:[parmas firstObject] withObject:[parmas lastObject]];
142 
143             return NO;
144 
145         }
146 
147 //这里处理参数很麻烦,我们可以自己实现一个类去将苹果自带的方法进行优化,其实就是可以传递不同的参数(多个)去处理相应的事件
148 
149         [self performSelector:sel withObject:parma];
150 
151         return NO;
152 
153     }
154 
155 
156 
157     return YES;
158 
159 }

 

调用方法:

 1 - (void)call
 2 {
 3     NSLog(@"%s", __func__);
 4 }
 5 
 6 // callWithNumber:
 7 - (void)callWithNumber:(NSString *)number
 8 {
 9     NSLog(@"打电话给%@", number);
10 }
11 
12 //sendMessageWithNumber:andContent:
13 
14 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content
15 {
16     NSLog(@"发信息给%@, 内容是%@", number, content);
17 }
18 
19 - (void)sendMessageWithNumber:(NSString *)number andContent:(NSString *)content status:(NSString *)status
20 {
21     NSLog(@"发信息给%@, 内容是%@, 发送的状态是%@", number, content, status);
22 }


此时我们就可以在JS中调用OC的时候根据不同需求传递响应的参数

          

1  function btnClick()
2 
3             {
4 
5                 location.href = "xmg://sendMessageWithNumber_andContent_?10086";
6 
7             }

 

 

iOS开发——网络开发OC篇&OC与JS交互简单案例

标签:

原文地址:http://www.cnblogs.com/iCocos/p/4758419.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!