2014-04-01 3 views
1

정적 인 압축 버전의 웹 사이트를 webView의 대상으로 사용할 수있는 사용자 지정 NSURLProtocol을 구현했습니다. 이동 중에도 zip을 열고 필요한 데이터를로드합니다. 하지만 문제는 NSURLProtocol이 상대 경로와 제대로 작동하지 않는 것 같습니다.NSURLProtocol 및 상대 경로

assets/css/main.css 
assets/css/style.css 
assets/images/sprite.png 
index.html 

그리고 사용하여 CSS에서 sprite.png 전화 : 그건 내가 다음과 같은 구조를 가지고있는 누락, //host/images/sprite.png : background: url(../images/sprite.png) no-repeat; 하지만, 내 사용자 지정 NSURLProtocol의 requestURL는 방식을 보여줍니다 자산 부분. .. 부분을 assets으로 바꾸면 제대로 작동하지만 차라리이 작업을 수행하지 않아도됩니다.

동일한 문제가 여기에서 발견되었습니다 : Loading resources from relative paths through NSURLProtocol subclass하지만 답변이 없습니다.

요청이 적절하게 상대 경로를 해결하거나 나중에 경로를 수정하도록이 문제를 해결할 수있는 방법을 찾을 수 없습니다 (하지만 요청의 출처를 알아야하며 운이 없었습니다. 어느 쪽이든)

감사합니다. 사전에 감사드립니다.

사이드 참고 : main.css가에 @import url("style.css");를 사용 같은 문제

편집 : 내가 원격 서버에서 zip 파일을 다운로드하여 시작

:에서

NSURL * fetchURL = [NSURL URLWithString:zipURLString]; 
[…] 
NSString * filePath = [[self documentsDirectory] stringByAppendingPathComponent:fetchURL.path.lastPathComponent]; 
[zipData writeToFile:filePath atomically:YES]; 

그래서 http://host/foo/archive.zip, 나는 그것을 documentsDirectory/archive.zip에 저장합니다. 거기에서 , 나는 zip 파일을에 가리 키도록 방식과 URL을 변경 :

myzip 열립니다
NSString * str = [NSString stringWithFormat:@"myzip://%@", zipURL.path.lastPathComponent]; 
[_webView loadRequest:[NSURLRequest str]]; 

: //archive.zip, 그리고 이러한 파일이 zip 파일에서 발견되지 않은 경우, 내가 추가/index.html을 현재 경로로 변경하십시오. 따라서 다음과 같은 요청은 내 NSURLProtocol 서브 클래스 - (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id <NSURLProtocolClient>)client에 도착 :

myzip://archive.zip (Changed to myzip://archive.zip/index.html) 
myzip://archive.zip/assets/css/main.css 
myzip://archive.zip/styles.css (Problem here) 

답변

0

는 마지막으로 수정되었습니다.

나는 내 NSURLProtocol에서 다음을했다 :

- (void)startLoading { 
    [self.client URLProtocol:self 
      didReceiveResponse:[[NSURLResponse alloc] init] 
      cacheStoragePolicy:NSURLCacheStorageNotAllowed]; 
    //Some other stuff 
} 

을하고 다음과 같이 문제를 해결 :

_lastReqURL이 _lastReqURL = request.URL;입니다
- (void)startLoading { 
    [self.client URLProtocol:self 
      didReceiveResponse:[[NSURLResponse alloc] initWithURL:_lastReqURL MIMEType:nil expectedContentLength:-1 textEncodingName:nil] 
      cacheStoragePolicy:NSURLCacheStorageNotAllowed]; 
    //Some other stuff 
} 

,

- (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id <NSURLProtocolClient>)client { 
    self = [super initWithRequest:request cachedResponse:cachedResponse client:client]; 
    if (self) { 
     _lastReqURL = request.URL; 
     // Some stuff 
    } 
} 

에서 나는 단지 수 거래시 NSURLResponse의 URL 부분이 중요하다고 가정합니다. relative-paths (논리적 인 것처럼 보임)를 사용합니다.

+0

이 질문에 대한 답변을 https : // stackoverflow .com/questions/44584159/nsurlprotocol-subclass-changes-urls-automatically – Mrug

0

나는 이것이 당신이 요청하거나 HTML을로드 할 방법을 참조 것 같아요. 요청에 대한 코드를 붙여 넣을 수 있습니까? 난 당신이 로컬 HTML을로드, 추측, 그래서 그에 따라 base을 설정하는 것을 잊지 마세요, 다른 상대하는 Pathes 더 이상 작동하지 않습니다

예를 들어 다음

[self.webView loadHTMLString:html baseURL:[NSURL URLWithString:@"host"]]; 
+0

내 질문을 편집했지만 지금 볼 수 있듯이, 아니요, 저는 loadHTMLString을 로컬로 사용하지 않고 대신 loadRequest를 사용합니다. – Nerkatel

+0

안녕하세요, zipData가 filePath에 기록 될 때 zip-folder-structure가 유지되는지 확인하십시오. 내 생각에 구조가 사라질 수도 있습니다. 시뮬레이터에서 이것을 확인할 수 있습니까? – Lepidopteron

+0

나는 구조가 유지되고 있다고 믿는다. 다음과 같이 기록했다 :'인덱스 9의 파일은 "assets/css/main.css",'인덱스 12의 파일은 "assets/css/styles.css" zip_get_num_entries' libzip 메소드. 나는 zip 파일 (이미 압축 된 파일) 만 다운로드하고 filePath에 저장하고 있는데, 구조가 프로세스에서 손실 될 가능성이 있다고 생각하지 않습니까? – Nerkatel