應用程序之UIWebView的使用

  • UIWebView簡介
  • 知識點總結
  • 代碼實現

1、UIWebView簡介html

1. iOS 內置的瀏覽器控件 ,能夠瀏覽網頁、打開文檔等
2.可以加載 html/htm pdf docx txt 等格式的文件
3.系統自帶的 Safari 瀏覽器就是經過 UIWebView 實現的
2、知識總結
1⃣️UIWebView是內置瀏覽器控件,可以加載htmlpdftxt等多種格式文件
2⃣️經常使用加載方法:
loadRequest:
loadHTMLString:baseURL:
loadData:MIMEType:textEncodingName:baseURL:
3⃣️經常使用導航方法:
goBack – 回退  
goForward – 前進 
reload - 重載  
stopLoading 取消載入內容
4⃣️經常使用屬性:
scalespageToFit – 自動對頁面進行縮放以適應屏幕
dataDetectorTypes 設定電話號碼、網址、電子郵件和日期等文字變爲連接文字
瀏覽器經過MIME標誌符能夠知道使用哪一種插件讀取相關文件
5⃣️iOS
能夠直接調用js代碼與頁面通信
3、代碼實例
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
相關文章
相關標籤/搜索