Как загрузить локальный HTML-файл в UIWebView


165

Я пытаюсь загрузить HTML-файл в мой UIWebView, но он не будет работать. Вот этап: у меня есть папка с именем html_files в моем проекте. Затем я создал webView в конструкторе интерфейсов и назначил ему выход в viewController. Это код, который я использую для добавления файла HTML:

-(void)viewDidLoad
{
    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html" inDirectory:@"html_files"];
    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile];
    [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];
    [super viewDidLoad];
}

Это не будет работать, и UIWebView пуст. Буду признателен за помощь.

Ответы:


272

вероятно, лучше использовать NSString и загрузить HTML-документ следующим образом:

Objective-C

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html"];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
[webView loadHTMLString:htmlString baseURL: [[NSBundle mainBundle] bundleURL]];

стриж

let htmlFile = NSBundle.mainBundle().pathForResource("fileName", ofType: "html")
let html = try? String(contentsOfFile: htmlFile!, encoding: NSUTF8StringEncoding)
webView.loadHTMLString(html!, baseURL: nil) 

Swift 3 имеет несколько изменений:

let htmlFile = Bundle.main.path(forResource: "intro", ofType: "html")
let html = try? String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
webView.loadHTMLString(html!, baseURL: nil)

Ты пробовал?

Также убедитесь, что ресурс был найден по pathForResource:ofType:inDirectoryвызову.


Это не сработало, я сделал NSLog (@ "% @", htmlFile); просто проверить, и он говорит, что ноль.
Madcoderz

Так что значит ресурс не найден. Проверьте только с помощью: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; без inDirectory
user478681

без inDirectory я получил: iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html, но HTML не показывался на экране, он все еще был пуст. Я что-то упустил? Вот пример проекта: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz

3
вам просто нужно исправить кадр вашего веб-просмотра
user478681

3
Этот ответ имеет много голосов, но, похоже, устарел. Локальное изображение и CSS-ресурсы не будут загружаться при использовании этого подхода. Смотрите этот ответ вместо.
paulmelnikow

90

РЕДАКТИРОВАТЬ 2016-05-27 - loadRequestвыставляет «универсальную уязвимость межсайтового скриптинга». Убедитесь, что у вас есть каждый актив, который вы загружаете. Если вы загрузите плохой скрипт, он может загрузить все, что захочет.

Если вам нужны относительные ссылки для локальной работы, используйте это:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"my" withExtension:@"html"];
[webView loadRequest:[NSURLRequest requestWithURL:url]];

Пакет будет искать все подкаталоги проекта, чтобы найти my.html. (структура каталогов выравнивается во время сборки)

Если my.htmlесть тэг <img src="some.png">, то webView загрузится some.pngиз вашего проекта.


4
Я не мог заставить принятый ответ на этой странице работать - но этот подход сработал впервые. Я думаю, что iOS перешла с момента первоначального ответа. Спасибо.
Джеймс

Спасибо за этот ответ. В этом отличие от принятого ответа - ссылки в HTML-документации.
Эми

2
Согласно Apple Чтобы помочь вам избежать уязвимости к атакам безопасности, обязательно используйте loadHTMLString: baseURL: для загрузки локальных файлов HTML; не используйте loadRequest :.
ED-209

Принятый ответ не работает для меня. Спасибо @neal Ehardt, этот ответ работает для меня.
Михир Оза

Это работает только для меня, если html-файл не находится внутри какой-либо папки
Ренан Франка

40

этим вы можете загрузить html-файл, который находится в вашем проекте Assets (bundle) в webView.

 UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
    [web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];

может быть, это полезно для вас.


это то же самое, что я делаю, с той лишь разницей, что вы создаете webView программно. Но все равно спасибо
madcoderz

вы получите путь к проверке этого HTML-файла NSLog.
AJPatel

Целевое членство html-файла должно быть проверено, иначе будет выдано следующее исключение: -Пропускающее приложение из-за необработанного исключения «NSInvalidArgumentException», причина: «*** - [NSURL initFileURLWithPath: isDirectory:]: параметр строки nil»
Durai Amuthan. H

9

Я думаю, что вам нужно allocateи начать свой webviewпервый ::

- (void)viewDidLoad
{
    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html" inDirectory:@"html_files"];
    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile];
    webView = [[UIWebView alloc] init];
    [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];

    [super viewDidLoad];
}

8

Простой фрагмент кода копирования-вставки:

-(void)LoadLocalHtmlFile:(NSString *)fileName onWebVu:(UIWebView*)webVu
{
    [webVu loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:fileName ofType:@"html"]isDirectory:NO]]];
}

Примечание:

Убедитесь, что членство в html-файле проверено, иначе будет выдано следующее исключение: -

введите описание изображения здесь

Завершение приложения из-за необработанного исключения

'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:isDirectory:]: nil string parameter'


6

Для Swift 3 и Swift 4:

let htmlFile = Bundle.main.path(forResource: "name_resource", ofType: "html")
let html = try! String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
self.webView.loadHTMLString(html, baseURL: nil)

Это не будет загружать связанные файлы, такие как <img src = "..." />
Pierre F

5
UIWebView *web=[[UIWebView alloc]initWithFrame:self.view.frame];
    //[self.view addSubview:web];
    NSString *filePath=[[NSBundle mainBundle]pathForResource:@"browser_demo" ofType:@"html" inDirectory:nil];
    [web loadRequest:[NSURLRequest requestWhttp://stackoverflow.com/review/first-postsithURL:[NSURL fileURLWithPath:filePath]]];

4

Может быть, ваш HTML-файл не поддерживает кодировку UTF-8, потому что тот же код работает для меня.

Или вы можете также эти строки кода:

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"Notes For Apple" ofType:@"htm" inDirectory:nil];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
[WebView loadHTMLString:htmlString baseURL:nil];

4

Вот способ работы HTML-файла с Jquery.

 _webview=[[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)];
    [self.view addSubview:_webview];

    NSString *filePath=[[NSBundle mainBundle]pathForResource:@"jquery" ofType:@"html" inDirectory:nil];

    NSLog(@"%@",filePath);
    NSString *htmlstring=[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

    [_webview loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];
                         or
    [_webview loadHTMLString:htmlstring baseURL:nil];

Вы можете использовать любые запросы для вызова HTML-файла в вашем UIWebview


3

Убедитесь, что «html_files» является каталогом в основном комплекте вашего приложения, а не просто группой в XCode.


3

Новый способ сделать это с помощью Swift. UIWebView больше не существует, и WKWebView - это новый класс для загрузки веб-страниц, который обеспечивает функции Safari для веб-представления.

    import WebKit

    let preferences = WKPreferences()
    preferences.javaScriptCanOpenWindowsAutomatically = false

    let configuration = WKWebViewConfiguration()
    configuration.preferences = preferences

    let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
    let request = NSURLRequest(URL: NSURL(string: "http://nshipster.com"))
    webView.loadRequest(request)

3
Swift iOS:

 // get server url from the plist directory
        var htmlFile = NSBundle.mainBundle().pathForResource("animation_bg", ofType: "html")!
        var htmlString = NSString(contentsOfFile: htmlFile, encoding: NSUTF8StringEncoding, error: nil)
        self.webView.loadHTMLString(htmlString, baseURL: nil)

3
[[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];

Это может быть поздно, но если файл от pathForResourceis nilвы должны добавить его в Build Phases > Copy Bundle Resources.

введите описание изображения здесь


2

Вот Свифт 3:

    if let htmlFile = Bundle.main.path(forResource: "aa", ofType: "html"){
        do{
            let htmlString = try NSString(contentsOfFile: htmlFile, encoding:String.Encoding.utf8.rawValue )
            messageWebView.loadHTMLString(htmlString as String, baseURL: nil)
        }
        catch _ {
        }
    }

1
if let htmlFile = NSBundle.mainBundle().pathForResource("aa", ofType: "html"){
    do{
        let htmlString = try NSString(contentsOfFile: htmlFile, encoding:NSUTF8StringEncoding )
        webView.loadHTMLString(htmlString as String, baseURL: nil)
    }
    catch _ {
    }
}

0

В Swift 2.0 ответ @ user478681 может выглядеть так:

    let HTMLDocumentPath = NSBundle.mainBundle().pathForResource("index", ofType: "html")
    let HTMLString: NSString?

    do {
        HTMLString = try NSString(contentsOfFile: HTMLDocumentPath!, encoding: NSUTF8StringEncoding)
    } catch {
        HTMLString = nil
    }

    myWebView.loadHTMLString(HTMLString as! String, baseURL: nil)

Лучше использовать let для проверки на
наличие

0

Поместите все файлы (html и ресурсы) в каталог (для моего «руководства»). Затем перетащите каталог в XCode через «Вспомогательные файлы». Вам следует проверить параметры «Копировать элементы при необходимости» и «Создать ссылки на папки». Далее напишите простой код:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"manual/index" withExtension:@"html"];
[myWebView loadRequest:[NSURLRequest requestWithURL:url]];

Внимание @"manual/index", руководство - это название моего каталога! Это все !!!! Извините за мой плохой английский...

================================================== =====================

Привет, Коста-Рика Ponga los archivos (html y demás recursos) en un Directorio (руководство пользователя), luego, arrastre y suelte en XCode, sobre «Файлы поддержки». Используется debe seleccionar las opciones «Копировать элементы при необходимости» y «Создать ссылки на папки».

NSURL *url = [[NSBundle mainBundle] URLForResource:@"manual/index" withExtension:@"html"];
[myWebView loadRequest:[NSURLRequest requestWithURL:url]];

Presta atención a @"manual/index", инструкция es el nombre de mi Directorio !!


0

Когда ваш проект станет больше, вам может понадобиться некоторая структура, чтобы ваша HTML-страница могла ссылаться на файлы, расположенные в подпапках.

Предполагая, что вы перетаскиваете свою html_filesпапку в Xcode и выбираете опцию Создать ссылки на папку , следующий код Swift гарантирует, что WKWebViewподдерживает также результирующую структуру папок:

import WebKit

@IBOutlet weak var webView: WKWebView!

if let path = Bundle.main.path(forResource: "sample", ofType: "html", inDirectory: "html_files") {
    webView.load( URLRequest(url: URL(fileURLWithPath: path)) )
}

Это означает, что если ваш sample.htmlфайл содержит <img src="subfolder/myimage.jpg">тег, файл изображения myimage.jpgв subfolderтакже будет загружен и отображен.

Кредиты: https://stackoverflow.com/a/8436281/4769344

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.