Pergunta

Eu tenho um WebView no meu aplicativo para iPhone e também tenho alguns arquivos HTML dentro da minha pasta de recursos. Quando meu aplicativo é carregado, carrego em uma página dos meus recursos na minha WebView. Mas preciso fazer links dentro do meu WebView que apontam para alguns outros recursos (por exemplo, imagens ou outros arquivos HTML). Apenas fazer um link relativo não funciona:

<a href="OtherPage.html">Doesn't work</a>
Foi útil?

Solução

Ao carregar esses recursos, você precisa definir o URL base. Você pode fazer isso usando o método:

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL

... onde BaseUrl seria o URL do arquivo da sua pasta de recursos.

Outras dicas

Aparentemente, há um pouco de petcha de acordo com o Notas de lançamento do iPhone SDK para iPhone OS 3.0:

Questão: A UIWebView não pode carregar recursos locais em aplicativos construídos no 3.0.

Ao usar [UIWebView loadHTMLString:baseURL:], a string html não deve se referir aos recursos locais com o file:// esquema. Em vez disso, passe NULL ou a file://Url para baseURL:, ou incluir os recursos diretamente no HTML com <style> e <script> Tag.

Justo. Mas passando em uma emissão padrão file:// Url para baseURL não funciona bem. No entanto ... acontece que, se você mudar / para // e espaços para %20, você estará definido! (Usando %20 Faz muito sentido, mas a parte da albatéia dupla me pegou de surpresa.)

Digamos que você já tenha NSString *markup configurar. Aqui está tudo o que você faz. (Eu envolvi o código aqui para legibilidade. Você pode refatorar/ajustar a gosto.)

 NSString *resourcePath = [[[[NSBundle mainBundle] resourcePath]
     stringByReplacingOccurrencesOfString:@"/" withString:@"//"]
     stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
 [webView loadHTMLString:markup baseURL:[NSURL URLWithString:
     [NSString stringWithFormat:@"file:/%@//", resourcePath]]];

Desde que seu CSS, JavaScript e imagens sejam referidos apenas pelo nome do arquivo, isso deve fazer o truque no iPhone OS 3.0, onde loadHTMLString:baseURL: está preocupado!

Eu consertei: usei isso para o BaseUrl como agosto disse:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];

Obrigada!

Esse código retornaria uma string com o URL de um arquivo chamado "Otherpage.html" no diretório de recursos do seu pacote.

[[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"OtherPage" ofType:@"html"]] absoluteString]

Isso funcionou para mim. Meus arquivos HTML estavam em sub-dobras (não grupos) no meu projeto. Minha página HTML é chamada Page01 e o sub-Foldador é HTML:

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *pathToHtml = @"html";
NSURL *baseURL = [[NSURL alloc] initFileURLWithPath:pathToHtml isDirectory:YES];

NSString *html = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]    
                             pathForResource:@"page01" ofType:@"html"                                                               
                             inDirectory:@"html"] 
                         encoding:NSUTF8StringEncoding error:nil];
[webview loadHTMLString:html baseURL:baseURL];

Tente carregar o OtherPage.html primeiro. Se você não puder, não está lá, e você perdeu parte de adicioná -lo ao projeto. Se você puder, pode haver apenas um erro de digitação no link, ou o Baseurl pode estar incorreto, conforme declarado em agosto. Quando criei um arquivo html com imagens que estavam no arquivo de recursos, funcionou bem apenas usando

<img src="file.png">

Dê uma olhada em como o PhoneGap faz isso. Aqui está o tutorial deles sobre recursos locais no iPhone. O passo 11 pode ser o que você está negligenciando.

Talvez tenha algo a ver com o Baseurl: quando eu carrego os recursos, uso esta linha:

[webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];

Veja no final, diz Baseurl: "". Se eu retirar isso, não funciona (falha), mas não sei o caminho para meus recursos. Se alguém faz .....?

Para mim, o problema era que os arquivos JS não foram incluídos no pacote. Certifique -se de verificar isso.

Ok, aqui 3,5 anos depois :) ... tentei a sugestão de Michael Gaylord acima exatamente, mas não funcionou em Sims para 5.0, 5.1, 6.0, 6.1 - nem em dispositivos reais que executam o mesmo. No entanto Isso é tão esclarecido sobre onde os recursos são incluídos ( Para onde está indo a saída de construção? ) ajudou a fazer funcionar para mim assim:

  1. Crie uma pasta Finder no projeto (como Michael sugere - e eu também não tentei 'grupo')
  2. Coloque seu HTML nessa pasta usando o Finder
  3. no uso do Xcode Arquivo -> Adicionar arquivos ao projeto
  4. Verifique se o projeto reconhece que deve estar no pacote por:

    1. Clique com o botão direito do mouse no alvo principal do projeto em Navegador janela,
    2. verifique se os alvos estão selecionados, o Construir fases aba,
    3. Clique no Copiar recursos de pacote Triangle Thingy |>
    4. E - Aqui está o que é diferente do de Michael - Ele já deve mostrar seu arquivo HTML e o caminho. (Talvez os Xcoders tenham melhorado os arquivos AD AI :)

Então, tudo que eu tinha que fazer era copiar - Cole o código de Michael acima literalmente e mude esta linha:

                     inDirectory:@"html"] 

para:

                     inDirectory:nil]

e Shaazam ! funcionou :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top