Pergunta

Estou tentando resolver 2 coisas no meu UIWebView:

  1. Carregue os ativos locais no lugar de remotos, nas condições certas
  2. Carregar ativos remotos normalmente se não houver um local ou eles estiverem desatualizados
  3. Permita que o WebView volte "de volta" sem a necessidade de recarregar o HTML do servidor

Então, para lidar com o número 1 e o #2, implementei uma subclasse personalizada NSURLCache. Ele é chamado quando o WebView solicita ativos, e eu posso enviar os locais, abortando a chamada do servidor para o ativo. Eu até tenho um pequeno sistema de registro de data e hora que sabe se a versão local é antiga ou não para descobrir qual deles usar.

Mas o #3 está me jogando para um loop. Parece que, independentemente dos cabeçalhos de controle de cache, UIWebView Sempre recarregará o HTML ao voltar.

Então eu tentei forçar o cache do HTML no meu costume NSURLCache classe. Parece funcionar e retorna a instância de NSCachedURLResponse com o html eu quero, mas o UIWebView Não percebe e o carrega do servidor de qualquer maneira. Depois de algumas pesquisas, vejo que há algumas "inconsistências" com UIWebView E o cache do URL, e acho que esse é um. Funciona muito bem para ativos, mas não tão bom para o HTML que compõe a página que está tentando exibir.

Então eu decidi que, como isso pode não funcionar, faça -o manualmente. Eu criei uma pilha de URLs, e seus dados que eu busco manualmente e carrego -os loadData:MIMEType:textEncodingName:baseURL:. Eis que parecia funcionar muito bem! Agora eu podia voltar, o delegado da Web View interceptaria a carga e dizia para carregar meus dados obtidos manualmente, e o servidor não seria atingido.

No entanto, notei que o nsurlcache não estava mais sendo usado para meus ativos. Parece que só pede ativos em cache se você carregar conteúdo com loadRequest: e não carregando dados ou uma string html com o baseUrl defina corretamente.

Portanto, apesar de todos os meus esforços, não posso fazer uma visualização da Web carregar condicionalmente ativos locais e navegar de volta sem pressionar o servidor. Parece que tenho alguns bugs aqui no SDK.

  1. UIWebView ignora os servidores Cache-Control Cabeçalho para conteúdo HTML
  2. UIWebView pede a NSCachedURLResponseS para a solicitação HTML principal, mas é ignorado e descartado.
  3. UIWebView pergunta o NSURLCache Para ativos, se você o carregar com uma solicitação, mas ao carregar com HTML ou os dados, ela ignora completamente o cache e solicita -o diretamente do servidor remoto.

Então, primeiro, alguém vê uma solução para essas coisas? E segundo, qualquer motivo para que eu esteja sendo estúpido e estes não sejam realmente bugs do SDK?

Foi útil?

Solução 2

Eu abandonei isso. Havia muitos pegados. Em vez disso, apenas carrego uma nova página via Ajax. E em vez de [webview goBack] Eu tenho algum javascript personalizado para fazer coisas legais para mim [webview stringByEvaluatingJavascriptFromString:@"goBack()"]

Outras dicas

Para enfrentar seu primeiro #3:

Embora possa parecer um pouco pouco ortodoxo, que tal persistir no HTML baixado em um objeto NSUserDefaults como uma corda plana e restaurá -lo (condicionalmente) mais tarde quando você precisar?

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