Jak załadować lokalny plik HTML do UIWebView


165

Próbuję załadować plik HTML do mojego UIWebView, ale to nie zadziała. Oto etap: mam folder o nazwie html_files w moim projekcie. Następnie utworzyłem webView w kreatorze interfejsów i przypisałem do niego gniazdko w viewController. Oto kod, którego używam do dołączania pliku 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];
}

To nie zadziała, a UIWebView jest puste. Byłbym wdzięczny za pomoc.

Odpowiedzi:


272

prawdopodobnie lepiej jest użyć NSString i załadować dokument html w następujący sposób:

Cel 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]];

Szybki

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

Swift 3 ma kilka zmian:

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

Próbowałeś?

Sprawdź również, czy zasób został znaleziony przez pathForResource:ofType:inDirectorypołączenie.


To nie zadziałało, zrobiłem NSLog (@ "% @", htmlFile); tylko po to, by sprawdzić i mówi null.
madcoderz

Więc to oznacza, że ​​nie znaleziono zasobu. Sprawdź po prostu: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; bez inDirectory
user478681

bez inDirectory otrzymałem: iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html, ale html nie pojawił się na ekranie, nadal był pusty. Brakuje mi czegoś innego? Oto przykładowy projekt: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz

3
musisz tylko naprawić ramkę swojego
widoku

3
Ta odpowiedź ma wiele głosów, ale wydaje się być nieaktualna. Lokalne obrazy i zasoby CSS nie ładują się przy użyciu tego podejścia. Zamiast tego zobacz tę odpowiedź .
paulmelnikow

90

EDYCJA 2016-05-27 - loadRequestujawnia „uniwersalną lukę w zabezpieczeniach skryptów między witrynami”.Upewnij się, że jesteś właścicielem każdego załadowanego zasobu. Jeśli załadujesz zły skrypt, może załadować wszystko, czego chce.

Jeśli potrzebujesz linków względnych do pracy lokalnie, użyj tego:

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

Pakiet przeszuka wszystkie podkatalogi projektu, aby znaleźć my.html . (struktura katalogów zostaje spłaszczona w czasie kompilacji)

Jeśli my.htmlma tag <img src="some.png">, webView zostanie załadowany some.pngz Twojego projektu.


4
Nie udało mi się uzyskać zaakceptowanej odpowiedzi na tej stronie - ale to podejście zadziałało za pierwszym razem. Myślę, że iOS poszedł dalej od czasu oryginalnej odpowiedzi. Dzięki.
James

Dzięki za tę odpowiedź. Różnica między tym a akceptowaną odpowiedzią to linki w dokumencie HTML.
Amy

2
Według Apple Aby pomóc Ci uniknąć ataków bezpieczeństwa, pamiętaj o używaniu loadHTMLString: baseURL: do ładowania lokalnych plików HTML; nie używaj loadRequest :.
ED-209

Zaakceptowana odpowiedź nie działa dla mnie. Dzięki @neal Ehardt, ta odpowiedź działa dla mnie.
Mihir Oza

To działa tylko dla mnie, jeśli plik html nie znajduje się w żadnym folderze
Renan Franca

40

w ten sposób możesz załadować plik html, który jest w Twoim projekcie Assets (bundle) do 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]]];

może ci się to przydać.


robię to samo, jedyną różnicą jest to, że webView tworzysz programowo. Ale i tak dzięki
madcoderz

Uzyskać ścieżkę do sprawdzania pliku html przez NSLog.
AJPatel

Docelowe członkostwo w pliku html powinno zostać sprawdzone, w przeciwnym razie zostanie wyrzucony następujący wyjątek: -Koncząca aplikacja z powodu nieprzechwyconego wyjątku „NSInvalidArgumentException”, przyczyna: „*** - [NSURL initFileURLWithPath: isDirectory:]: nil parametr ciągu”
Durai Amuthan. H

9

Myślę, że musisz allocatei zainicjować swój webviewpierwszy:

- (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

Prosty fragment kodu kopiuj-wklej:

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

Uwaga:

Upewnij się, że członkostwo docelowe pliku html jest zaznaczone, w przeciwnym razie zostanie zgłoszony następujący wyjątek: -

wprowadź opis obrazu tutaj

Zamykanie aplikacji z powodu nieprzechwyconego wyjątku

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


6

Dla Swift 3 i 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)

Nie spowoduje to załadowania plików połączonych, takich jak <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

Być może Twój plik HTML nie obsługuje kodowania UTF-8, ponieważ ten sam kod działa dla mnie.

Lub możesz również te linie kodu:

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

Oto sposób działania pliku HTML z 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];

Możesz użyć obu żądań, aby wywołać plik HTML w swoim UIWebview


3

Upewnij się, że „html_files” to katalog w głównym pakiecie Twojej aplikacji, a nie tylko grupa w Xcode.


3

Nowy sposób na zrobienie tego za pomocą narzędzia Swift. UIWebView już nie istnieje, a WKWebView to nowa klasa do ładowania stron internetowych, która zapewnia funkcje Safari w widoku sieci Web.

    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"];

Może być późno, ale jeśli plik pochodzi z pathForResourcedomeny nil, należy go dodać w formacie Build Phases > Copy Bundle Resources.

wprowadź opis obrazu tutaj


2

Oto 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

W Swift 2.0 odpowiedź @ user478681 może wyglądać następująco:

    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)

lepiej użyć let, aby przetestować pod
kątem

0

Umieść wszystkie pliki (html i zasoby) w katalogu (dla mojego „podręcznika”). Następnie przeciągnij i upuść katalog do XCode, nad „Supporting Files”. Należy zaznaczyć opcje „W razie potrzeby kopiuj elementy” i „Utwórz odniesienia do folderów”. Następnie napisz prosty kod:

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

Uwaga @"manual/index", podręcznik to nazwa mojego katalogu !! To wszystko !!!! Przepraszam za mój zły angielski...

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

Hola desde Costa Rica. Ponga los archivos (html y demás recursos) en un directorio (en mi caso lo llamé manual), luego, arrastre y suelte en XCode, sobre „Supporting Files”. Usted debe seleccionar las opciones "Kopiuj elementy w razie potrzeby" y "Utwórz odniesienia do folderów".

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

Kiedy Twój projekt się powiększy, możesz potrzebować jakiejś struktury, aby strona HTML mogła odwoływać się do plików znajdujących się w podfolderach.

Zakładając, że przeciągniesz html_filesfolder do Xcode i wybierzesz opcję Utwórz odwołania do folderów , poniższy kod Swift zapewnia, że WKWebViewobsługuje również wynikową strukturę folderów:

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)) )
}

Oznacza to, że jeśli twój sample.htmlplik zawiera <img src="subfolder/myimage.jpg">tag, to plik graficzny myimage.jpgw programie subfolderrównież zostanie załadowany i wyświetlony.

Kredyty: https://stackoverflow.com/a/8436281/4769344

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.