WebView加载本地文件可以使用加载数据的方式 1. NSData 本地文件对应的数据 2. MIMEType 3. 编码格式字符串 4. 相对地址,一般加载本地文件不使用,可以在指定的baseURL中查找相关文件 如果要用UIWebView显示对应的文件,必须知道准确的MIMEType 但是,不是所有格式的文件都可以通过本地数据的方式加载,即便是知道MIMEType UIWebView加载内容的三种方式: 1. 加载本地数据文件 需要制定文件的MIMEType 编码格式使用@"UTF-8" 2. 加载html字符串 可以加载全部或者部分hmtl字符串 3. 加载NSURLRequest 前面两步与NSURLConnection一致 使用HTML5开发应用 优势: 1. 跨平台 2. 审批通过之后,就终身不需要审批,只需要在后台自己随时维护即可 弱势: 1. 没有办法利用硬件资源,加速剂、手势 2. 性能不好 部分显示html的功能,可以方便制作新闻客户端阅读部分的UI
常用加载方法: loadRequest: loadHTMLString:baseURL: loadData:MIMEType:textEncodingName:baseURL: 常用导航方法: goBack – 回退 goForward – 前进 reload - 重载 stopLoading - 取消载入内容 常用属性: scalespageToFit – 自动对页面进行缩放以适应屏幕 dataDetectorTypes - 设定电话号码、网址、电子邮件和日期等文字变为链接文字 浏览器通过MIME标志符可以知道使用哪种插件读取相关文件 iOS可以直接调用js代码与页面通讯
1.创建UIWebVIew
UIWebView *webView = [[UIWebView alloc]initWithFrame:self.view.bounds]; [self.view addSubview:webView]; // 检测所有数据类型 [webView setDataDetectorTypes:UIDataDetectorTypeAll]; self.webView = webView;
// HTML5 // 直接加载HTML字符串,完整的html NSString *str = @"<html><head><title>Hello</title></head><body><h1>Hello</h1><ul><li>123</li><li>321</li><li>1234567</li></ul></body></html>"; // 部分html NSString *str1 = @"<h1>Hello</h1><ul><li>123</li><li>321</li><li>1234567</li></ul>"; [self.webView loadHTMLString:str1 baseURL:nil];
NSString *path = [[NSBundle mainBundle]pathForResource:@"iOS6Cookbook.pdf" ofType:nil]; NSURL *url = [NSURL fileURLWithPath:path]; NSLog(@"%@", [self mimeType:url]); // 以二进制数据的形式加载沙箱中的文件 NSData *data = [NSData dataWithContentsOfFile:path]; [self.webView loadData:data MIMEType:@"application/pdf" textEncodingName:@"UTF-8" baseURL:nil];
- (void)loadText { NSString *path = [[NSBundle mainBundle]pathForResource:@"关于.txt" ofType:nil]; NSURL *url = [NSURL fileURLWithPath:path]; NSLog(@"%@", [self mimeType:url]); NSData *data = [NSData dataWithContentsOfFile:path]; [self.webView loadData:data MIMEType:@"text/plain" textEncodingName:@"UTF-8" baseURL:nil]; }
- (void)loadHTML { NSString *path = [[NSBundle mainBundle]pathForResource:@"demo.html" ofType:nil]; NSURL *url = [NSURL fileURLWithPath:path]; NSLog(@"%@", [self mimeType:url]); // 以二进制数据的形式加载沙箱中的文件 NSData *data = [NSData dataWithContentsOfFile:path]; [self.webView loadData:data MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:nil]; }
- (NSString *)mimeType:(NSURL *)url { // 1. NSURLRequest NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 2. NSURLConnection // 从NSURLResponse可以获取到服务器返回的MIMEType // 使用同步方法获取MIMEType NSURLResponse *response = nil; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; return response.MIMEType; }
#pragma mark 后退 - (void)goBack { NSLog(@"后退"); [self.webView goBack]; } #pragma mark 前进 - (void)goForward { NSLog(@"前进"); [self.webView goForward]; } #pragma mark 刷新 - (void)refresh { NSLog(@"刷新"); [self.webView reload]; }
UIWebViewDelegate代理方法
// 网页开始加载的时候调用 - (void)webViewDidStartLoad:(UIWebView *)webView // 网页加载完成的时候调用 - (void)webViewDidFinishLoad:(UIWebView *)webView // 网页加载出错的时候调用 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error // 网页中的每一个请求都会被触发这个方法,返回NO代表不执行这个请求(常用于JS与iOS之间通讯) - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
// 获取当前页面的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(); "];
NSString *js_fit_code = [NSString stringWithFormat:@"var meta = document.createElement('meta');" "meta.name = 'viewport';" "meta.content = 'width=%f, initial-scale=%f, minimum-scale=0.1,maximum-scale=1.0, user-scalable=yes';" "document.getElementsByTagName('head')[0].appendChild(meta);",_webView.frame.size.width,_webView.frame.size.width/1000]; [_webView setScalesPageToFit:YES];