2010-01-21 2 views
0

나는 오프라인으로 작업하려고 시도한 웹 애플리케이션이 있습니다. 웹 애플리케이션은 너무 커서 응용 프로그램 캐시를 단순히 사용하기 위해 크기가 축소되었습니다 (다운로드 할 수 있지만 결국에는 window.applicationCache 오류가 발생합니다). 나는 XMLHttpRequest를 사용하여 더 큰 스크립트와 기본 HTML을 얻고 localStorage에 보관하고 응용 프로그램 캐시에 작은 로더 스크립트 만 보관하려고합니다. 문제는 로더 스크립트가 로컬에서 제공 될 때 XMLHttpRequest가 네트워크 오류를 반환한다는 것입니다. 캐시가 다운로드 될 때 오류가 반환되지 않고 정상적으로 작동합니다. 응용 프로그램 캐시를 끄면 로더가 제대로 작동하지만 물론 네트워크를 통해 로더를 가져와야합니다.iPhone 응용 프로그램 캐시 및 XMLHttpRequest

나는 setRequestHeader("Cache-Control", "no-cache")을 시도했지만 도움이되지 않았습니다.

아무도 단서가 있습니까?

답변

1

해결책을 찾은 것 같습니다. 그것은 아마도 다른 사람들에게도 도움이 될 것입니다.

로더를 XMLHttpRequest를 사용하여 필요한 모든 파일을 가져 와서 localStorage (로더)에 저장하고 localStorage에서 파일을 읽기 만하면 문서에 기록하는 두 개의 HTML 파일로 나눕니다. booter)와 적절한 래퍼 (예 :). 부트 프로그램에는 응용 프로그램 캐시에 보관할 매니페스트 파일이 있습니다. 로더는 그렇지 않습니다. 사용자는 먼저 부트 프로그램을 호출합니다. 만약 booter가 이미 localStorage에있는 파일을 찾으면 그것은 그 일을합니다. 그렇지 않으면 location.replace()를 사용하여 로더를 호출합니다. 로더는 XMLHttpRequest를 사용하여 서버에서 파일을로드하고 localStorage에 배치 한 다음 location.replace()를 사용하여 부트 프로그램을 다시 호출합니다. 이 네트워크 오류가 발생하지 않는 것 같습니다.

오프라인으로 실행하려면 사용자가 iPhone Safari 브라우저 (부트 프로그램을 다시 실행하는 로더를 호출 함)에서 부트 프로그램을 호출하여 웹 애플리케이션을 부팅해야합니다. Safari에서 사용자는 웹 애플리케이션 (부트 링크)을 홈 화면에 추가해야합니다 (하단의 "+"버튼 사용). 오프라인 일 때 사용자는 홈 화면 아이콘에서 앱으로 이동할 수 있습니다. 다시 렌더링하려면 몇 초가 걸리지 만 이후에는 완전히 기능합니다. 온라인 때와 같은 지연입니다. iPhone Safari 브라우저에서 링크를 호출하면 온라인으로 작동하지만 오프라인에서는 작동하지 않습니다.

부트러는 응용 프로그램 캐시의 "updateready"이벤트를 모니터링하여 온라인 및 iPhone이 부트 프로그램의 매니페스트 파일에서 변경 사항을 감지하고 새 부트 프로그램을 다운로드하면 새 캐시 (window.applicationCache.swapCache()) location.replace()를 사용하여 로더를 다시 호출합니다. 나는 또한 펑키가 진행되고 있음을 사용자에게 알려주는 경고()를 추가한다. 따라서 매니페스트 파일을 변경하면 클라이언트가 온라인 일 때 새로운 파일을 가져 오게됩니다.

흥미롭게도 Safari에서 설정 한 localStorage는 쿠키가 전송 되더라도 홈 화면 아이콘을 호출하여 제공된 동일한 페이지에서 사용할 수 없다는 것을 알았습니다! 따라서 아이콘에서 부트 프로그램이 처음 실행될 때 이전에 Safari에로드 되었더라도 파일을 다시로드합니다. 또한 나머지 파일이 업데이트되었을 때 서버에서 다시로드하지 않아 로더가 캐싱되지 않도록 명시 적으로 방지해야했습니다.

2

매니페스트의 네트워크 섹션이 어떻게 생겼습니까?

와일드 카드 네트워크 트래픽을 허용하지 않으면 XMLHttpRequest가로드되지 않는다는 것을 발견했습니다.

네트워크 : 그래서로 변경 *

우리를 위해 트릭을했다.

0

정확합니다. 궁극적으로 매니페스트의 네트워크 섹션이었습니다.

응용 프로그램이로드 된 사이트가 자동으로 포함되어 있다고 생각했는데 그 사이트를 망칠 필요가 없었지만 사실이 아닙니다. 사이트를 네트워크 섹션에 배치해야합니다.