2014-04-01 116 views
1

我實現了一個自定義NSURLProtocol,它允許我使用靜態壓縮版本的網站作爲webView的目標。它隨時打開zip並加載所需的數據。 但問題是,NSURLProtocol似乎不能正確處理相對路徑?這就是我有以下結構:NSURLProtocol和相對路徑

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

而且使用呼叫從CSS sprite.png:background: url(../images/sprite.png) no-repeat; 但是,在我的自定義NSURLProtocol的requestURL顯示方案://host/images/sprite.png,缺少資產部分。它工作正常,如果我切換..部分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。 從那裏,我改方案和URL指向ZIP文件:

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

這將打開myzip://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 
} 

和解決的問題有以下:

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

哪裏_lastReqURL爲_lastReqURL = request.URL;,從

- (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部分非常重要與相對路徑(似乎是合乎邏輯的)。

+0

你對這個問題有什麼想法嗎? https:// stackoverflow .COM /問題/ 44584159/nsurlprotocol子類,變化的URL,自動 – Mrug

0

我覺得這可能是指你加載請求或HTML的方式。 你可以粘貼你的請求的代碼?我想,你在本地加載HTML,所以不要忘記設置相應的基本URL,否則相對pathes將不再工作:

例如以下:

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

編輯我的問題,但現在你可以看到,不,我沒有在本地使用loadHTMLString,而是使用loadRequest。 – Nerkatel

+0

嘿Nerkatel,當zipData寫入filePath時,請確保zip文件夾結構保持不變。我認爲,結構可能會迷路。你能在模擬器中驗證這個嗎? – Lepidopteron

+0

我相信結構是保留的,我登錄了以下內容:'索引9處的文件是「assets/css/main.css」',索引12處的文件是「assets/css/styles.css」'...使用' zip_get_num_entries' libzip方法。我只是下載壓縮文件(已壓縮)並將其保存到filePath中,我不認爲在這個過程中結構可能會丟失,是嗎? – Nerkatel