So laden Sie eine lokale HTML-Datei in UIWebView

165

Ich versuche, eine HTML-Datei in meine UIWebView zu laden, aber es funktioniert nicht. Hier ist die Phase: Ich habe einen Ordner namens html_files in meinem Projekt. Dann habe ich im Interface Builder eine WebView erstellt und ihr im viewController eine Steckdose zugewiesen. Dies ist der Code, mit dem ich die HTML-Datei anhänge:

-(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];
}

Das wird nicht funktionieren und die UIWebView ist leer. Ich würde mich über Hilfe freuen.

Madcoderz
quelle

Antworten:

272

Wahrscheinlich ist es besser, NSString zu verwenden und das HTML-Dokument wie folgt zu laden:

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

Schnell

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

Swift 3 hat nur wenige Änderungen:

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

Hast du versucht?

Überprüfen Sie auch, ob die Ressource per pathForResource:ofType:inDirectoryAufruf gefunden wurde .

user478681
quelle
Das hat nicht funktioniert, ich habe NSLog gemacht (@ "% @", htmlFile); nur um zu überprüfen und es heißt null.
Madcoderz
Das bedeutet also, dass die Ressource nicht gefunden wurde. Überprüfen Sie mit nur: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; ohne inDirectory
user478681
ohne inDirectory bekam ich: iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html aber das HTML wurde nicht auf dem Bildschirm angezeigt, es war immer noch leer. Ich vermisse etwas anderes? Hier ist das Beispielprojekt: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz
3
Sie müssen nur den Rahmen Ihrer Webansicht reparieren
user478681
3
Diese Antwort hat viele Stimmen, scheint aber veraltet zu sein. Lokale Image- und CSS-Assets würden mit diesem Ansatz nicht geladen. Siehe stattdessen diese Antwort .
Paulmelnikow
90

EDIT 2016-05-27 - loadRequestenthüllt "eine universelle Sicherheitsanfälligkeit in Bezug auf Cross-Site Scripting". Stellen Sie sicher, dass Sie jedes einzelne Asset besitzen, das Sie laden. Wenn Sie ein fehlerhaftes Skript laden, kann es alles laden, was es will.

Wenn Sie relative Links benötigen, um lokal zu arbeiten, verwenden Sie Folgendes:

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

Das Bundle durchsucht alle Unterverzeichnisse des Projekts, um sie zu finden my.html. (Die Verzeichnisstruktur wird beim Erstellen abgeflacht.)

Wenn my.htmldas Tag vorhanden ist <img src="some.png">, wird die Webansicht some.pngaus Ihrem Projekt geladen .

Neal Ehardt
quelle
4
Ich konnte die akzeptierte Antwort auf dieser Seite nicht zum Laufen bringen - aber dieser Ansatz funktionierte beim ersten Mal. Ich denke, iOS ist seit der ursprünglichen Antwort weitergegangen. Vielen Dank.
James
Danke für diese Antwort. Was daran anders ist als die akzeptierte Antwort, sind Links in der HTML-Dokumentarbeit.
Amy
2
Laut Apple Verwenden Sie loadHTMLString: baseURL:, um lokale HTML-Dateien zu laden, damit Sie nicht anfällig für Sicherheitsangriffe sind. Verwenden Sie nicht loadRequest:.
ED-209
Akzeptierte Antwort funktioniert bei mir nicht. Danke @neal Ehardt diese Antwort funktioniert für mich.
Mihir Oza
Dies funktioniert nur für mich, wenn sich die HTML-Datei nicht in einem Ordner befindet
Renan Franca
40

Auf diese Weise können Sie eine HTML-Datei, die sich in Ihrem Projekt Assets (Bundle) befindet, in webView laden.

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

Möglicherweise ist dies für Sie nützlich.

AJPatel
quelle
Das ist das gleiche, was ich mache. Der einzige Unterschied besteht darin, dass Sie das WebView programmgesteuert erstellen. Aber trotzdem danke
madcoderz
Sie erhalten den Pfad dieser HTML-Datei von NSLog überprüft.
AJPatel
Die Zielmitgliedschaft der HTML-Datei sollte überprüft werden, da sonst die folgende Ausnahme ausgelöst wird: - Beenden der App aufgrund der nicht erfassten Ausnahme 'NSInvalidArgumentException', Grund: '*** - [NSURL initFileURLWithPath: isDirectory:]: Null-String-Parameter'
Durai Amuthan. H
9

Ich denke du musst allocateund initiierst dein webviewerstes ::

- (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];
}
Saran
quelle
8

Ein einfaches Code-Snippet zum Kopieren und Einfügen:

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

Hinweis:

Stellen Sie sicher, dass die Zielmitgliedschaft der HTML-Datei aktiviert ist. Andernfalls wird die folgende Ausnahme ausgelöst: -

Geben Sie hier die Bildbeschreibung ein

Beenden der App aufgrund einer nicht erfassten Ausnahme

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

Durai Amuthan.H
quelle
6

Für Swift 3 und 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)
Pableiros
quelle
Dies lädt keine verknüpften Dateien wie <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]]];
Raees Valapuram Madathil
quelle
4

Möglicherweise unterstützt Ihre HTML-Datei keine UTF-8-Codierung, da für mich derselbe Code funktioniert.

Oder Sie können auch diese Codezeile:

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];
user1173142
quelle
4

Hier die Arbeitsweise von HTML-Dateien mit 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];

Sie können entweder die Anforderungen verwenden, um die HTML-Datei in Ihrer UIWebview aufzurufen

Abhilash Reddy kallepu
quelle
3

Stellen Sie sicher, dass "html_files" ein Verzeichnis im Hauptpaket Ihrer App ist und nicht nur eine Gruppe in Xcode.

ppalancica
quelle
3

Ein neuer Weg, dies mit Swift zu tun. Das UIWebView gibt es nicht mehr und WKWebView ist die neue Klasse zum Laden von Webseiten, die die Safari-Funktionen in der Webansicht sicherstellt.

    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)
Govind
quelle
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)
Vinod Joshi
quelle
3
[[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];

Es kann spät sein, aber wenn die Datei von pathForResourceist nil, sollten Sie sie in die hinzufügen Build Phases > Copy Bundle Resources.

Geben Sie hier die Bildbeschreibung ein

Atif Imran
quelle
2

Hier ist 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 _ {
        }
    }
Jonesie
quelle
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 _ {
    }
}
ingconti
quelle
0

In Swift 2.0 könnte die Antwort von @ user478681 folgendermaßen aussehen:

    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)
Thomas Jeans
quelle
besser verwenden lassen, um gegen Fehler im Pfad / keine Datei zu testen:
ingconti
0

Legen Sie alle Dateien (HTML und Ressourcen) in ein Verzeichnis (für mein "Handbuch"). Ziehen Sie als Nächstes das Verzeichnis über "Unterstützende Dateien" in XCode. Sie sollten die Optionen "Elemente bei Bedarf kopieren" und "Ordnerreferenzen erstellen" aktivieren. Schreiben Sie als nächstes einen einfachen Code:

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

Achtung @"manual/index", Handbuch ist der Name meines Verzeichnisses !! Es ist alles !!!! Entschuldigung für mein schlechtes Englisch...

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

Hola desde Costa Rica. Ponga los archivos (html y demás recursos) und un directio (en mi caso lo llamé manual), luego, arrastre y suelte en XCode, sobre "Supporting Files". Usted debe seleccionar las opciones "Elemente bei Bedarf kopieren" y "Ordnerreferenzen erstellen".

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

Presta atención a @"manual/index", Handbuch es el nombre de mi Directorio !!

Erick López Alvarado
quelle
0

Wenn Ihr Projekt größer wird, benötigen Sie möglicherweise eine Struktur, damit Ihre HTML-Seite auf Dateien in Unterordnern verweisen kann.

Angenommen, Sie ziehen Ihren html_filesOrdner auf Xcode und wählen die Option Ordnerreferenzen erstellen . Der folgende Swift- Code stellt sicher, dass WKWebViewauch die resultierende Ordnerstruktur unterstützt wird:

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

Dies bedeutet, dass wenn Ihre sample.htmlDatei ein <img src="subfolder/myimage.jpg">Tag enthält , die Bilddatei myimage.jpginsubfolder wird auch geladen und angezeigt werden.

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

Pierre F.
quelle