Como carregar o arquivo html local no UIWebView

165

Estou tentando carregar um arquivo html no meu UIWebView, mas ele não funciona. Aqui está o estágio: eu tenho uma pasta chamada html_files no meu projeto. Então, criei um webView no construtor de interface e designei uma saída para ele no viewController. Este é o código que estou usando para acrescentar o arquivo 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];
}

Isso não funcionará e o UIWebView está em branco. Eu apreciaria alguma ajuda.

madcoderz
fonte

Respostas:

272

provavelmente é melhor usar o NSString e carregar o documento html da seguinte maneira:

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

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 tem poucas mudanças:

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

Você tentou?

Verifique também se o recurso foi encontrado por pathForResource:ofType:inDirectorychamada.

user478681
fonte
Isso não funcionou, eu fiz o NSLog (@ "% @", htmlFile); apenas para verificar e diz nulo.
madcoderz
Portanto, esse recurso médio não foi encontrado. Verifique apenas com: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; sem inDirectory
user478681
sem o inDirectory, obtive: iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html mas o html não apareceu na tela e ainda estava vazio. Estou sentindo falta de algo mais? Aqui está o projeto de exemplo: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz
3
você só precisa quadro de correção do seu webview
user478681
3
Esta resposta tem muitos votos, mas parece estar desatualizada. A imagem local e os recursos CSS não seriam carregados usando essa abordagem. Veja esta resposta .
precisa saber é o seguinte
90

EDIT 27/05/2016 - loadRequestexpõe "uma vulnerabilidade universal de script entre sites". Certifique-se de possuir todos os ativos que você carrega. Se você carregar um script incorreto, ele poderá carregar o que quiser.

Se você precisar de links relativos para trabalhar localmente, use este:

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

O pacote procurará todos os subdiretórios do projeto para encontrar my.html. (a estrutura de diretórios é achatada no momento da construção)

Se my.htmltiver a tag <img src="some.png">, o webView será carregado some.pngdo seu projeto.

Neal Ehardt
fonte
4
Não consegui que a resposta aceita nesta página funcionasse - mas essa abordagem funcionou pela primeira vez. O iOS mudou desde a resposta original, eu acho. Obrigado.
James
Obrigado por esta resposta. O que há de diferente nisso versus a resposta aceita são os links no documento doc HTML.
22714 Amy
2
De acordo com a Apple Para ajudar você a evitar ser vulnerável a ataques de segurança, use loadHTMLString: baseURL: para carregar arquivos HTML locais; não use loadRequest :.
ED-209
A resposta aceita não está funcionando para mim. Obrigado @neal Ehardt, esta resposta está funcionando para mim.
Mihir Oza
Isso só funciona para mim se o arquivo html não é dentro de qualquer pasta
Renan Franca
40

com isso, você pode carregar o arquivo html que está no seu projeto Ativos (pacote configurável) no 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]]];

Pode ser que isso seja útil para você.

AJPatel
fonte
é o mesmo que estou fazendo. A única diferença é que você está criando o webView programaticamente. Mas obrigado de qualquer maneira
madcoderz
u obtém o caminho dessa verificação de arquivo html pelo NSLog.
AJPatel
A associação de destino do arquivo html deve ser verificada, caso contrário, a seguinte exceção será lançada: -Aplicativo final devido à exceção não capturada 'NSInvalidArgumentException', motivo: '*** - [NSURL initFileURLWithPath: isDirectory:]: nil string parameter'
Durai Amuthan. H
9

Eu acho que você precisa allocatee inicia o seu webviewprimeiro ::

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

Um trecho de código simples de copiar e colar:

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

Nota:

Verifique se a associação ao destino do arquivo html está marcada, caso contrário, a seguinte exceção será lançada: -

insira a descrição da imagem aqui

A encerrar a aplicação devido a uma exceção não detectada

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

Durai Amuthan.H
fonte
6

Para Swift 3 e 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
fonte
Isso não vai carregar arquivos 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
fonte
4

Pode ser que seu arquivo HTML não suporte a codificação UTF-8, porque o mesmo código está funcionando para mim.

Ou você também pode estas linhas 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];
user1173142
fonte
4

Aqui a maneira como o trabalho do arquivo HTML com o 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];

Você pode usar as solicitações para chamar o arquivo HTML no seu UIWebview

Abhilash Reddy kallepu
fonte
3

Verifique se "html_files" é um diretório no pacote principal do seu aplicativo, e não apenas um grupo no Xcode.

ppalancica
fonte
3

Uma nova maneira de fazer isso usando o swift. O UIWebView não existe mais e o WKWebView é a nova classe para carregar páginas da web, o que garante os recursos do Safari para a visualização da 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
fonte
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
fonte
3
[[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];

Pode ser tarde, mas se o arquivo pathForResourcefor, nilvocê deve adicioná-lo no Build Phases > Copy Bundle Resources.

insira a descrição da imagem aqui

Atif Imran
fonte
2

Aqui está o 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
fonte
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
fonte
0

No Swift 2.0, a resposta de @ user478681 pode ser assim:

    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
fonte
melhor usar let para testar contra erros no caminho / no arquivo:
ingconti
0

Coloque todos os arquivos (html e recursos) em um diretório (para o meu "manual"). Em seguida, arraste e solte o diretório no XCode, sobre "Arquivos de suporte". Você deve verificar as opções "Copiar itens, se necessário" e "Criar referências de pastas". Em seguida, escreva um código simples:

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

Atenção @"manual/index", manual é o nome do meu diretório !! É tudo !!!! Desculpe pelo meu inglês ruim ...

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

Olá desde Costa Rica. Coloque os arquivos (html e vários recursos) em um diretório (no caso, no manual do manual), luego, arraste e selecione no XCode, sobre "Supporting Files". Você deve selecionar as opções "Copiar itens, se necessário" e "Criar referências de pasta".

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

Presta atenção a @"manual/index", manual es el nombre de mi directorio !!

Erick López Alvarado
fonte
0

Quando o seu projeto cresce, você pode precisar de alguma estrutura, para que sua página HTML possa fazer referência a arquivos localizados em subpastas.

Supondo que você arraste sua html_filespasta para o Xcode e selecione a opção Criar referências de pasta , o código Swift a seguir garante que WKWebViewtambém seja compatível com a estrutura de pastas 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)) )
}

Isso significa que, se seu sample.htmlarquivo contiver uma <img src="subfolder/myimage.jpg">tag, o arquivo de imagem myimage.jpgemsubfolder também serão carregados e exibidos.

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

Pierre F
fonte