Uiwebview e nsurlcache têm um relacionamento problemático
-
21-09-2019 - |
Pergunta
Estou tentando resolver 2 coisas no meu UIWebView
:
- Carregue os ativos locais no lugar de remotos, nas condições certas
- Carregar ativos remotos normalmente se não houver um local ou eles estiverem desatualizados
- 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.
UIWebView
ignora os servidoresCache-Control
Cabeçalho para conteúdo HTMLUIWebView
pede aNSCachedURLResponse
S para a solicitação HTML principal, mas é ignorado e descartado.UIWebView
pergunta oNSURLCache
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?
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?