NSURLProtocol和相对路径

我实现了一个自定义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 ,但我宁愿没有这样做。

我在这里发现了同样的问题:通过NSURLProtocol子类从相对路径加载资源,但没有得到答案。

我无法找到任何方法来解决这个问题,以便请求正确地解决相对路径,或者之后自己修复路径(但是我需要知道请求来自哪里,并且在那里也没有运气)

任何帮助表示感谢,提前致谢。

附注:使用@import url("style.css");同样问题@import url("style.css"); 在main.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 。 从那里,我改变了方案和网址指向压缩文件:

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)

我认为这可能是指您加载请求或HTML的方式。 您可以将代码粘贴到您的请求中吗? 我想,你在本地加载HTML,所以不要忘记相应地设置baseURL,否则相对路径不再工作:

例如以下内容:

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

最后修复它。

我在我的NSURLProtocol有以下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部分非常重要(看起来很合理)。

链接地址: http://www.djcxy.com/p/5935.html

上一篇: NSURLProtocol and relative paths

下一篇: NSURLProtocol fails for video request