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

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         邮箱: [email protected]</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             }
时间: 2024-10-22 23:41:26

iOS开发——网络开发OC篇&OC与JS交互简单案例的相关文章

iOS开发——实用技术OC篇&amp;UIWebView与JS的交互

UIWebView与JS的交互 事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img > 标签自动加载,并把下载图片的操作放在native端来处理,并通过JS将图片在Cache中的地址返回给UIWebv

iOS开发——网络编程Swift篇&amp;Alamofire详解

Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AFNetworking非常稳定,在Mac OSX与iOS中也能像其他Objective-C代码一样用Swift编写.不过Alamofire更适合Swift语言风格习惯(Alamofire与AFNetworking可以共存一个项目中,互不影响). Alamofire 取名来源于Alamo Fire fl

iOS开发——网络编程OC篇&amp;(一)XMPP简单介绍与准备

XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容. 有许多的IM系统,如AOL IM.Yahoo IM. MSN以及QQ,它们最大的区别在于各自通讯协议的实现,所以即时通讯技术的核心在于它的传输协议. 协议用来说明信息在网络上如何传输,如果有了统一的传输协议,那么应当可以实现各个IM之间的直接通讯,为了创建即时通讯的统一标准,目前已经出现过

iOS开发——混编Swift篇&amp;OC移植为swift

将Ojective-C代码移植转换为Swift代码 2015-03-09 15:07发布:yuhang浏览:201 相比于Objective-C,Swift语言更加简练.有时我们需要把原来写的一些Objective-C代码转换成Swift,下面总结了各种常见的情况. 1,构造函数的迁移 Objective-C为: 1 HanggeMenuItem *starMenuItem1 = [[HanggeMenuItem alloc] initWithImage:storyMenuItemImage 2

iOS开发——图形与动画篇OC篇&amp; POP简单介绍及使用

POP简单介绍及使用 前言 动画在APP开发过程中 大家多多少少都会接触到 而且随着ios7的扁平化风格启用之后 越来越多的APP开始尝试加入各种绚丽的动画交互效果以增加APP的用户体验(当然 还是以国外的APP居多) 有过相关开发经验的同学肯定知道在iOS中 动画相关的部分都是基于Core Animation 但是今天我们不讨论Core Animation 今天的主角是POP -来自于Facebook的动画引擎(其实我不喜欢把POP定义为动画引擎 我愿意称它为函数发生器) 介绍 官方地址 ht

iOS开发——图形与动画篇OC篇&amp;图层基本上动画

图层的一些基本动画效果 #define kRadianToDegrees (radian) (radian * 180.0) / (M_PI) //闪烁 [self.testView.layer addAnimation:[self opacityForever_Animation:0.5] forKey:nil]; //移动 [self.testView.layer addAnimation:[self duration:3 move:[NSNumber numberWithInteger:2

iOS开发——网络编程Swift篇&amp;(八)SwiftyJSON详解

SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库SwiftyJSON,问题迎刃而解,灰常优雅和Swifty! 简单介绍下这个库(内容译自SwiftyJSON的README): 为什么典型的在Swift中处理JSON的方法不好? Swift语言是一种严格的类型安全语言,它要求我们显示的设置类型,并帮助我们写出更少bug的代码.但是当处理JSON这种

iOS开发——网络编程Swift篇&amp;(二)同/异&amp;步请求

同/异&步请求 同步: 1 // MARK: - 同步请求 2 func httpSynchronousRequest() 3 { 4 //创建NSURL对象 5 var url:NSURL! = NSURL(string: "http://m.weather.com.cn/data/101010100.html") 6 7 //创建请求对象 8 var urlRequest : NSURLRequest = NSURLRequest(URL: url) 9 10 //响应对象

iOS开发——网络编程Swift篇&amp;(七)NSURLSession详解

NSURLSession详解 1 // MARK: - /* 使用NSURLSessionDataTask加载数据 */ 2 func sessionLoadData() 3 { 4 //创建NSURL对象 5 var url:NSURL! = NSURL(string: "http://m.weather.com.cn/data/101010100.html") 6 7 //创建请求对象 8 var request : NSURLRequest = NSURLRequest(URL: