Cómo cargar un archivo html local en UIWebView


165

Estoy tratando de cargar un archivo html en mi UIWebView pero no funcionará. Aquí está la etapa: tengo una carpeta llamada html_files en mi proyecto. Luego creé un webView en el generador de interfaces y le asigné una salida en viewController. Este es el código que estoy usando para agregar el archivo 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];
}

Eso no funcionará y UIWebView está en blanco. Agradecería un poco de ayuda.

Respuestas:


272

probablemente es mejor usar NSString y cargar el documento html de la siguiente manera:

C objetivo

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

Rápido

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

Swift 3 tiene pocos cambios:

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

¿Has probado?

Compruebe también que el recurso se encontró por pathForResource:ofType:inDirectoryllamada.


Eso no funcionó, hice NSLog (@ "% @", htmlFile); solo para verificar y dice nulo.
madcoderz

Entonces ese recurso medio no se encuentra. Verifique con: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; sin inDirectory
user478681

sin inDirectory obtuve: iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html pero el html no apareció en la pantalla, todavía estaba vacío. ¿Me estoy perdiendo algo más? Aquí está el proyecto de muestra: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz

3
solo necesita arreglar el marco de su webview
user478681

3
Esta respuesta tiene muchos votos pero parece estar desactualizada. La imagen local y los activos CSS no se cargarían con este enfoque. Ver esta respuesta en su lugar.
paulmelnikow

90

EDITAR 2016-05-27 - loadRequestexpone "una vulnerabilidad universal de secuencias de comandos entre sitios". Asegúrese de poseer cada uno de los activos que carga. Si carga un script incorrecto, puede cargar lo que quiera.

Si necesita enlaces relativos para trabajar localmente, use esto:

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

El paquete buscará todos los subdirectorios del proyecto para encontrar my.html. (la estructura del directorio se aplana en el momento de la compilación)

Si my.htmltiene la etiqueta <img src="some.png">, el webView se cargará some.pngdesde su proyecto.


44
No pude obtener la respuesta aceptada en esta página para trabajar, pero este enfoque funcionó la primera vez. iOS ha avanzado desde la respuesta original, creo. Gracias.
James

Gracias por esta respuesta La diferencia entre esto y la respuesta aceptada es que los enlaces en el documento HTML funcionan.
Amy

2
Según Apple Para ayudarlo a evitar ser vulnerable a los ataques de seguridad, asegúrese de usar loadHTMLString: baseURL: para cargar archivos HTML locales; no use loadRequest :.
ED-209

La respuesta aceptada no me funciona. Gracias @neal Ehardt, esta respuesta está funcionando para mí.
Mihir Oza

Esto solo funciona para mí si el archivo html no está dentro de ninguna carpeta
Renan Franca

40

con esto puede cargar el archivo html que está en los Activos (paquete) de su proyecto en 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]]];

Puede ser que esto te sea útil.


Es lo mismo que estoy haciendo, la única diferencia es que está creando el WebView mediante programación. Pero gracias de todos modos
madcoderz

u obtiene la ruta de esa verificación de archivos html por NSLog.
AJPatel

La membresía de destino del archivo html debe verificarse; de ​​lo contrario, se generará la siguiente excepción: -Terminación de la aplicación debido a la excepción no detectada 'NSInvalidArgumentException', razón: '*** - [NSURL initFileURLWithPath: isDirectory:]: parámetro de cadena nulo'
Durai Amuthan. H

9

Supongo que necesitas allocatee iniciar tu webviewprimera ::

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

Un fragmento de código simple de copiar y pegar:

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

Nota:

Asegúrese de que la membresía de destino del archivo html esté marcada; de lo contrario, se generará la siguiente excepción: -

ingrese la descripción de la imagen aquí

Finalización de la aplicación debido a una excepción no detectada

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


6

Para Swift 3 y 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)

Esto no cargará archivos vinculados como <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

Puede ser que su archivo HTML no sea compatible con la codificación UTF-8, porque el mismo código funciona para mí.

O también puede estas líneas de código:

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

Aquí la forma en que funciona el archivo HTML con 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];

Puede usar las solicitudes para llamar al archivo HTML en su UIWebview


3

Asegúrese de que "html_files" es un directorio en el paquete principal de su aplicación, y no solo un grupo en Xcode.


3

Una nueva forma de hacer esto usando swift. UIWebView ya no existe y WKWebView es la nueva clase para cargar páginas web, lo que garantiza las características de Safari en la vista 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"];

Puede ser tarde, pero si el archivo pathForResourcees de nil, debe agregarlo en el archivo Build Phases > Copy Bundle Resources.

ingrese la descripción de la imagen aquí


2

Aquí está 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

En Swift 2.0, la respuesta de @ user478681 podría verse así:

    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)

mejor usar let para probar contra el error en la ruta / sin archivo:
ingconti

0

Ponga todos los archivos (html y recursos) en un directorio (para mi "manual"). A continuación, arrastre y suelte el directorio en XCode, sobre "Archivos de soporte". Debe verificar las opciones "Copiar elementos si es necesario" y "Crear referencias de carpeta". A continuación, escriba un código simple:

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

Atención a @"manual/index", manual de es el nombre de mi directorio! Es todo !!!! Perdón por mi mal ingles...

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

Hola desde Costa Rica. Ponga los archivos (html y otros recursos) en un directorio (en mi caso lo llamé manual), luego, arrastre y suelte en XCode, sobre "Archivos de soporte". Usted debe seleccionar las opciones "Copiar elementos si es necesario" y "Crear referencias de carpeta".

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

Cuando su proyecto crezca, es posible que necesite algo de estructura, de modo que su página HTML pueda hacer referencia a archivos ubicados en subcarpetas.

Suponiendo que arrastre su html_filescarpeta a Xcode y seleccione la opción Crear referencias de carpeta , el siguiente código Swift asegura que el WKWebViewsoporte también sea compatible con la estructura de carpetas resultante:

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

Esto significa que si su sample.htmlarchivo contiene una <img src="subfolder/myimage.jpg">etiqueta, entonces el archivo de imagen myimage.jpgensubfolder que también se va a cargar y se muestra.

Créditos: https://stackoverflow.com/a/8436281/4769344

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.