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.

madcoderz
fuente

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.

usuario478681
fuente
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.

Neal Ehardt
fuente
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.

AJPatel
fuente
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];
}
Saran
fuente
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'

Durai Amuthan.H
fuente
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)
pableiros
fuente
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]]];
Raees Valapuram Madathil
fuente
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];
usuario1173142
fuente
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

Abhilash Reddy kallepu
fuente
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.

ppalancica
fuente
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)
Govind
fuente
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
fuente
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í

Atif Imran
fuente
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 _ {
        }
    }
Jonesie
fuente
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
fuente
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)
Thomas Jeans
fuente
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 !!

Erick López Alvarado
fuente
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

Pierre F
fuente