首页 > 技术文章 > 应用程序之UIWebView的使用

letougaozao 2014-04-16 12:05 原文

  • UIWebView简介
  • 知识点总结
  • 代码实现

一、UIWebView简介

1.iOS内置的浏览器控件,可以浏览网页、打开文档等
2.能够加载html/htmpdfdocxtxt等格式的文件
3.系统自带的Safari浏览器就是通过UIWebView实现的
二、知识总结
1⃣️UIWebView是内置浏览器控件,能够加载htmlpdftxt等多种格式文件
2⃣️常用加载方法:
loadRequest:
loadHTMLString:baseURL:
loadData:MIMEType:textEncodingName:baseURL:
3⃣️常用导航方法:
goBack – 回退  
goForward – 前进 
reload - 重载  
stopLoading 取消载入内容
4⃣️常用属性:
scalespageToFit – 自动对页面进行缩放以适应屏幕
dataDetectorTypes 设定电话号码、网址、电子邮件和日期等文字变为链接文字
浏览器通过MIME标志符可以知道使用哪种插件读取相关文件
5⃣️iOS
可以直接调用js代码与页面通讯
三、代码实例
1⃣️图解
#import "ViewController.h"

@interface ViewController ()

// 访问指定URL字符串的内容,仅由文本框事件调用
- (void)gotoURLString:(NSString *)urlString;

// 访问指定的URL内容
- (void)gotoURL:(NSURL *)url;

// 获得本地文件的MIMEType
- (NSString *)MIMEType:(NSString *)fileName;

@end

@implementation ViewController

#pragma mark - UIWebView加载内容的测试方法
// 加载HTML字符串
- (void)testLoadHTMLString
{
    // 测试加载HTML字符串
    NSString *html = @"<html><head><title>Hello</title></head><body><h1>Hello Itcast</h1></body></html>";
    
    [_webView loadHTMLString:html baseURL:nil];
}

// 加载部分HTML字符串测试
- (void)testLoadPartHTMLString
{
    // 测试加载部分HTML字符串,不需要显示整个网页内容时,通常使用此方法
    NSString *partHtml = @"<h1>Hello Itcast</h1>";
    [_webView loadHTMLString:partHtml baseURL:nil];
}

// 测试加载本地HTML文件
- (void)testLoadHTMLFile
{
    // 测试加载本地HTML文件,需要指定MIMETYPE
    NSString *dataPath = [[NSBundle mainBundle]pathForResource:@"demo" ofType:@"html"];
    NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]resourcePath] isDirectory:YES];
    
    // 只有加载的html文件才需要指定baseURL路径,告诉浏览器去哪里找图片、样式表等文件
    [_webView loadData:[NSData dataWithContentsOfFile:dataPath] MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:baseURL];
}

// 加载本地PDF文件
- (void)testLoadPDFFile
{
    // 测试加载本地PDF,需要指定MIMETYPE
    NSString *dataPath = [[NSBundle mainBundle]pathForResource:@"001.网络基础" ofType:@"pdf"];
    
    [_webView loadData:[NSData dataWithContentsOfFile:dataPath] MIMEType:@"application/pdf" textEncodingName:@"UTF-8" baseURL:nil];
}

// 加载本地文本文件
- (void)testLoadTextFile
{
    // 测试加载本地文本文件,需要指定MIMETYPE
    NSString *dataPath = [[NSBundle mainBundle]pathForResource:@"关于" ofType:@"txt"];
    
    [_webView loadData:[NSData dataWithContentsOfFile:dataPath] MIMEType:@"text/plain" textEncodingName:@"UTF-8" baseURL:nil];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self MIMEType:@"001.网络基础.pdf"];
    
    [self testLoadHTMLFile];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - UITextField代理方法
// 文本框回车事件
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if (textField == _urlText && textField.text.length > 0) {
        [textField resignFirstResponder];
        
        [self gotoURLString:textField.text];
    }
    
    return YES;
}

#pragma mark - IBActions
// 回退操作
- (IBAction)goBack:(id)sender
{
    [_webView goBack];
}

// 前进操作
- (IBAction)goForward:(id)sender
{
    [_webView goForward];
}

// 刷新
- (IBAction)reloadURL:(id)sender
{
    [_webView reload];
}

// 提交表单
- (IBAction)submit:(id)sender
{
    // 获取当前页面的url
    NSString *url = [_webView stringByEvaluatingJavaScriptFromString:@"document.location.href"];
    NSLog(@"url %@", url);

    // 获取当前页面的标题
    NSString *title = [_webView stringByEvaluatingJavaScriptFromString:@"document.title"];
    NSLog(@"title %@", title);

    // 提交表单
    [_webView stringByEvaluatingJavaScriptFromString:@"document.forms[0].submit(); "];
}

#pragma mark - 访问指定URL内容
// 访问指定URL字符串的内容,仅由文本框事件调用,文本框回车时候调用的
- (void)gotoURLString:(NSString *)urlString
{
    NSURL *url = nil;
    
    // 判断是否是httpURL
    if ([urlString hasPrefix:@"http://"]) {
        // URL中有中文的,是需要加百分号的!
        url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    } else if ([urlString hasPrefix:@"file://"]) {
        // 判断给定参数是否已经是完整的url路径,避免出现前进后退后,URL变成完整URL无法访问的情况
        if ([urlString hasPrefix:@"file://localhost/"]) {
            // 注意此处不能使用fileURLWithPath方法
            url = [NSURL URLWithString:urlString];
        } else {
            // 如果没有localhost前缀的,说明是新输入的本地文件,需要转换url。
            // 检测字串范围
            NSRange range = [urlString rangeOfString:@"file://"];
            // 截取剩余部分作为文件名
            NSString *fileName = [urlString substringFromIndex:range.length];
            // 生成文件路径
            NSString *path = [[NSBundle mainBundle]pathForResource:fileName ofType:nil];
            
            // 判断文件是否存在
            if ([[NSFileManager defaultManager]fileExistsAtPath:path]) {
                url = [NSURL fileURLWithPath:path];
            } else {
                url = nil;
            }
        }        
    }
    
    // 判断输入是否正确
    if (url == nil) {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示"
                                                       message:@"输入地址不正确,请重新输入!"
                                                      delegate:nil
                                             cancelButtonTitle:@"确定"
                                             otherButtonTitles:nil, nil];
        [alert show];
        // 设置文本框输入焦点
        [_urlText becomeFirstResponder];
    } else {
        // 访问指定的URL内容
        [self gotoURL:url];
    }
}

// 访问指定的URL内容
- (void)gotoURL:(NSURL *)url
{
    // 使用URL字符串替代URL文本框
    [_urlText setText:[url absoluteString]];
    
    // 定义请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 设置数据检测类型
    [_webView setDataDetectorTypes:UIDataDetectorTypeAll];
    
    // 加载请求
    [_webView loadRequest:request];
}

// 获得本地文件的MIMEType
- (NSString *)MIMEType:(NSString *)fileName
{
    // 定义路径
    NSString *path = [[NSBundle mainBundle]pathForResource:fileName ofType:nil];
    // 定义URL
    NSURL *url = [NSURL fileURLWithPath:path];
    // 定义请求
    NSURLRequest *request = [NSURLRequest requestWithURL: url];
    // 定义响应
    NSURLResponse *response = nil;
    
    // 发送同步请求
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
    
    NSLog(@"MIMEType is %@", [response MIMEType]);
    
    return [response MIMEType];
}

#pragma mark - UIWebViewDelegate 代理方法
// 网页开始加载的时候调用
- (void)webViewDidStartLoad:(UIWebView *)webView
{
    NSLog(@"开始加载");
}

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

// 网页加载出错的时候调用
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    NSLog(@"加载出错%@", [error localizedDescription]);
}

// 网页中的每一个请求都会被触发这个方法,返回NO代表不执行这个请求(常用于JS与iOS之间通讯)
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSLog(@"将要加载请求");
    
    return YES;
}

@end

 

推荐阅读