2010-01-19 4 views
4

UIWebView에서 2 가지를 해결하려고합니다.UIWebView 및 NSURLCache 문제가있는 관계가 있습니다.

  1. 올바른 조건에서 원격 자산 대신 로컬 자산로드
  2. 로컬 자산이 없거나
  3. 으로 오래된 경우 원격 자산을 정상적으로로드하십시오.
  4. 그래서 # 1과 # 2를 다루기 위해 xxx29 사용자 정의 서브 클래스를 구현했습니다. webview가 애셋을 요청할 때 호출되고, 대신 로컬 애셋에 대한 서버 호출을 중단하여 로컬 애셋을 보낼 수 있습니다. 로컬 버전이 오래되었거나 사용할 버전을 알 수없는 작은 타임 스탬프 시스템도 있습니다.

    그러나 # 3은 나를 위해 루프를 던지고 있습니다. 캐시 제어 헤더와 상관없이 UIWebView은 돌아갈 때 항상 HTML을 다시로드합니다.

    그래서 사용자 지정 NSURLCache 클래스의 HTML 캐싱을 강제로 시도했습니다. 그것은 작동하는 것, 내가 원하는 HTML NSCachedURLResponse의 인스턴스를 반환하지만, UIWebView 통지에 실패하고 어쨌든 서버에서로드합니다. 일부 검색 후에 UIWebView 및 URL 캐시에 "불일치"가 있음을 알 수 있습니다. 애셋에 적합하지만 표시하려는 페이지를 구성하는 HTML에는 적합하지 않습니다.

    그렇다면이 방법이 효과가 없을 수 있으므로 수동으로 해보십시오. 나는 수동으로 가져 와서 loadData:MIMEType:textEncodingName:baseURL:로로드하는 URL 스택과 데이터를 만들었습니다. 소호하고 위대한 일을 한 것처럼 보입니다! 이제 다시 돌아갈 수 있습니다. 웹보기 대리인이로드를 가로 채고 수동으로 가져온 데이터를로드하도록 지시하고 서버에 적중되지 않게 할 수 있습니다.

    그런데 NSURLCache가 더 이상 내 자산에 사용되지 않는다는 것을 알았습니다. loadRequest:으로 컨텐츠를로드하고 baseUrl 세트가 올바르게 설정된 데이터 또는 html 문자열을로드하지 않으면 캐시 된 자산 만 묻는 것 같습니다.

    그래서 모든 노력에도 불구하고 조건부로 로컬 자산을로드하고 서버를 치지 않고 다시 탐색 할 수있는 웹보기를 만들 수 없습니다. SDK에 몇 가지 버그가있는 것 같습니다.

      UIWebView UIWebView은 HTML 내용에 대해 서버 Cache-Control 헤더를 무시합니다.
    1. NSCachedURLResponse은 기본 HTML 요청에 대해 NSCachedURLResponse을 요청하지만 무시되고 무시됩니다.
    2. NSURLCacheNSURLCache에 요청으로로드 할 경우 NSURLCache에 요청하지만 HTML 또는 데이터를로드 할 때 캐시를 완전히 무시하고 원격 서버에서 직접 요청합니다.

    그래서 처음에는 누구나 이러한 것들에 대한 해결책을 볼 수 있습니까? 둘째, 어리석은 이유가 SDK 버그가 아닙니다.

답변

1

나는 이것을 버렸습니다. 너무 많은 잡기가있었습니다. 대신 아약스를 통해 새 페이지를로드합니다. 그리고 대신에 [webview goBack] 나는 나를 위해 멋진 물건을 할 몇 가지 사용자 정의 자바 스크립트가 [webview stringByEvaluatingJavascriptFromString:@"goBack()"]

+0

좋은 아이디어 - 이것도 메모리 할당을 줄여주기 때문에 - 그물이나 캐시에서 @ runtime을 가져와야하는 이미지 자산은 어떨까요? 나는 언젠가는 그것을 풀어 줘야하지만 확실하지는 않다. 내 시도는 다음과 같다. http://stackoverflow.com/questions/3215641/overriding-nsurlcaches-cachedresponseforrequest-to-cache-uiwebview-assets-with-t –

+0

당신은 할 수있다. 정말로. 원격 콘텐츠와 로컬 콘텐츠를 혼합하는 것은 큰 문제로 보입니다. NSURLCache 재정의는 광고 된대로 실제로 작동하지 않습니다. 그러나 콘텐츠가 로컬에서 시작되고'file : // '스타일 URL이로드되면 원격 자산과 로컬 자산을 잘 참조 할 수 있습니다. 하지만 그것은 수동으로 html, css, js 등의 로컬 복사본을 다운로드해야한다는 것을 의미합니다. 작동하지만 여전히 쉽지는 않습니다. –

1

첫 번째 # 3 해결하기 : 조금 정통 보일 수도 있지만

을, 플랫 문자열로 NSUserDefaults 객체에 다운로드 된 HTML을 지속하고 복원에 대한 (조건부) 당신은 어떻게해야 할 때 나중에?

+0

슬프게도 지금은 논점입니다. 아약스를 통해 새 페이지를로드하도록 서버 코드를 변경 했으므로 웹 뷰는 "다시로드되지 않습니다." 그것은 더 빠르고 더 관리하기 쉬운 것으로 보인다. –