我实现了一个自定义NSURLProtocol,它允许我使用网站的静态压缩版本作为webView的目标。它可以随时随地打开zip并加载所需的数据。
但是问题在于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显示scheme://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)
最佳答案
终于解决了。
我的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部分在处理相对路径时很关键(似乎是逻辑上的)。
关于ios - NSURLProtocol和相对路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22781523/