我实现了一个自定义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/

10-11 14:38