Як завантажити локальний 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-документ так:

Ціль-С

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
користувач478681

без вхідного каталогу я отримав: iPhone Simulator / 4.3.2 / Програми / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html, але html не з'явився на екрані, він все ще був порожнім. Я щось пропускаю? Ось зразок проекту: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz

3
вам просто потрібно виправити кадр свого веб-перегляду
user478681

3
Ця відповідь має багато голосів, але, здається, застаріла. Локальні зображення та активи CSS не завантажуватимуться за допомогою цього підходу. Дивіться замість цього відповідь .
paulmelnikow

90

EDIT 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">, веб-перегляд завантажиться some.pngз вашого проекту.


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

Дякую за цю відповідь. Що відрізняється від цього та прийнятої відповіді, - це посилання в роботі документа HTML.
Емі

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

Прийнята відповідь не працює для мене. Дякую @neal Ehardt, ця відповідь працює для мене.
Міхір Оза

Це працює тільки для мене, якщо файл html не знаходиться в жодній папці
Ренан Франка

40

за допомогою цього ви можете завантажити HTML-файл, який знаходиться у вашому проекті Активи (пакет) в 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 string'
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

Новий спосіб зробити це за допомогою швидкого. 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"];

Це може бути пізно , але якщо файл з pathForResourceце nilслід додати його в Build Phases > Copy Bundle Resources.

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


2

Ось Swift 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)

краще використовувати хай для тестування на помилку в шляху / без файлу:
ingconti

0

Помістіть усі файли (html та ресурси) у каталог (для мого "посібника"). Потім перетягніть каталог до XCode над "Підтримка файлів". Ви повинні перевірити параметри "Копіювати елементи, якщо потрібно" та "Створити посилання на папки". Далі напишіть простий код:

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

Увага @"manual/index", інструкція - це назва мого каталогу !! Це все !!!! Вибачте за мою погану англійську ...

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

Hola desde Коста-Ріка. Ponga los archivos (html y demás recursos) en un Directorio (en mi caso lo llamé manual), luego, arrastre y suelte en XCode, sobre "Підтримуючі файли". Вкладене добірне видання на вибір "Копіюйте елементи, якщо потрібно", "Створіть посилання на папки".

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

Presta atención a @"manual/index", manual 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.