iOS UIWebView

UIWebView 是用来加载网页数据的一个框架。可以用来加载 pdf、word、txt 等文件。

UIWebView 加载函数

1
2
3
- (void)loadRequest:(NSURLRequest *)request;
- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;

加载网页

1
2
3
4
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)];
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]];
[webView loadRequest:request];
[self.view addSubview:webView];

代理方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 是否允许加载网页,也可获取 JS 要打开的 url,通过截取此 url 可与 JS 交互
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"是否允许加载网页");
return YES;
}

// 开始加载网页
- (void)webViewDidStartLoad:(UIWebView *)webView {
NSLog(@"开始加载网页");
}

// 网页加载完成
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"网页加载完成");
}

// 网页加载错误
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
NSLog(@"网页加载错误时调用");
}

OC 与 JS 交互

OC 调用 JS

OC 调用 JS 是通过下面的方法来实现的

1
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

为方法传入的参数 script 是将要执行的 JS 代码块,可以接收 NSString 类型的返回值。
例如,打印网页的标题,方法如下:

1
NSLog(@"%@",[webView stringByEvaluatingJavaScriptFromString:@"document.title"]);

JS 调用 OC

JS 是不可以调用 OC 的,但是 JS 可以将需要执行的OC操作封装到网络请求之中,然后由 OC 来拦截这个请求,获取 url 字符串进行解析,实现变相的调用。这种调用主要依赖的代理方法是:

1
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

当在 webView 中将要发起的网络请求的 url 写成 ios://js_sendMessage?title=111&detail=222 这个样子的时候,可以采用下面的方式在 APP 中截获请求,并进行相应的处理来调用本地的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString * url = request.URL.absoluteString;
NSString * scheme = @"ios://";
if ([url hasPrefix:scheme]) {

NSString * path = [url substringFromIndex:scheme.length];
NSArray * subPaths = [path componentsSeparatedByString:@"?"];
NSString * methodName = [NSString stringWithFormat:@"%@:",[subPaths firstObject]];
NSArray * params = nil;
if (subPaths.count == 2) {
params = [[subPaths lastObject] componentsSeparatedByString:@"&"];
}
NSMutableDictionary * dic = [NSMutableDictionary dictionary];
for (NSString * str in params) {
NSArray * arr = [str componentsSeparatedByString:@"="];
NSString * key = arr[0];
NSString * value = arr[1];
[dic setValue:value forKey:key];
}
if ([self respondsToSelector:NSSelectorFromString(methodName)] ) {
[self performSelector:NSSelectorFromString(methodName) withObject:dic];
}
return NO;

}
return YES;
}

- (void)js_sendMessage:(id)message{
NSDictionary * dic = message;
NSLog(@"%@",dic[@"title"]);
}

这样就实现了 JS 对 OC 的方法调用。