UIWebView使用浅析

概述

UIWebView是iOS sdk中一个最常用的控件,是内置的浏览器控件,我们可以用它来浏览网页、打开文档等等。可以在不发布版本的情况下改变其显示的内容。今天和大家一起看下UIWebView的使用。

本文包括下面内容

  • UIWebView的几种加载方式
  • Cookie的读取和赋值
  • UIWebView和JavaScript交互

一.UIWebView的几种加载方式

大体说来,给UIWebView添加内容的方式分两种:

  1. 一种是从一个文件加载,类似在浏览器上输入URL或本地文件路径

  2. 一种是将一段HTML原代码,直接赋给UIWebView

1.1 直接加载本地的HTML文件
NSURL *url = [NSURL URLWithString:@"http://www.google.com"]; 
[self.myWebview loadRequest:[NSURLRequest requestWithURL:url]];
1.2 直接加载本地的HTML文件
NSString *htmlPath = [[[NSBundle mainBundle] bundlePath]
    stringByAppendingPathComponent:@"index.html"];
[self.myWebview loadRequest:[NSURLRequest requestWithURL:
    [NSURL fileURLWithPath:htmlPath]]];
1.3 加载html字符串(可以加载全部或者部分html文件)
NSString *htmlPath = [[[NSBundle mainBundle] bundlePath]
    stringByAppendingPathComponent:@"index.html"];

NSString *htmlString = [NSString stringWithContentsOfFile: htmlPath
                                    encoding:NSUTF8StringEncoding 
                                    error:NULL];
[self.myWebview loadHTMLString:htmlString baseURL:[NSURL
    fileURLWithPath:htmlPath]];

二.Cookie的读取和赋值

2.1 Cookie的读取
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]; 
NSHTTPCookie *cookie;
for (id c in cookies){
    if ([c isKindOfClass:[NSHTTPCookie class]]) {
        cookie=(NSHTTPCookie *)c;
        NSLog(@"%@: %@", cookie.name, cookie.value); }
}
2.2 Cookie的赋值

注:如果提供的属性是无效的,初始化Cookie对象为nil。

NSHTTPCookieValue,NSHTTPCookieName,NSHTTPCookieDomain,NSHTTPCookiePath是必选的

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
    
[cookieProperties setObject:@"test" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"cookiesid" forKey:NSHTTPCookieName];
[cookieProperties setValue:@".baidu.com" forKey:NSHTTPCookieDomain];
[cookieProperties setValue:@"/" forKey:NSHTTPCookiePath];
    
NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

request还可以这样设置cookie

[request setHTTPShouldHandleCookies:YES];
[request setValue:[NSString stringWithFormat:@"%@=%@", [cookie name], [cookie value]] forHTTPHeaderField:@"Cookie"];

三.UIWebView和JavaScript交互

IOS中UIWebView和JavaScript交互可以分为两种:

  • 客户端传递给JS一些数据
  • JS向客户端请求一些本地操作
3.1 客户端传递给JS一些数据

客户端向JS传递数据,通过插入JS方法来实现,UIWebView的这个方法可以完成这项功能。

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

实例代码:可以看到html页面有一个由js弹出的弹窗

NSString *jsCode = [NSString stringWithFormat:@"alert("html页面加载成功!");"];
[myWebView stringByEvaluatingJavaScriptFromString:jsCode];

3.2 JS向客户端请求一些本地操作

这里的实现主要是通过对UIWebView的delegate方法进行处理来实现的。UIWebViewDelegate有这个一个方法

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

当一个web视图开始加载一个frame的时候会触发它。看起来很符合我们的需求。我们可以在页面里创建一个iframe,使用js代码去改变它的src来触发这个调用,从而实现js对Objc的调用。

实例代码:

html代码:



    
    
    
        
        
        

Hello UIWebView!

UIWebViewDelegate处理

- (BOOL)webView:(UIWebView *)webView 
        shouldStartLoadWithRequest:(NSURLRequest *)request
        navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = [request URL];
    if ([[url scheme] isEqualToString:@"app"]) {
        if ([[url host] isEqualToString:@"login"]) {
            //后续处理代码
            NSString *params = [myWebView stringByEvaluatingJavaScriptFromString:@"JSTest.getJSData();"];
            NSLog(@"%@",params);
        } else {
            
        }
        return NO;
    }
    return YES;
}

通过在得到webview所要加载的url来判断是否是需要处理的条件,只需要定义好相关的协议串即可。


后记:这里只是浅析了UIWebView的一些使用方法,欢迎大家指导和交流!

你可能感兴趣的:(UIWebView使用浅析)