Ios NSURL协议及其相关路径

Ios NSURL协议及其相关路径,ios,relative-path,nsurlprotocol,Ios,Relative Path,Nsurlprotocol,我实现了一个定制的NSURL协议,它允许我使用网站的静态压缩版本作为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

我实现了一个定制的NSURL协议,它允许我使用网站的静态压缩版本作为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
但是,自定义NSURL协议中的requestURL显示scheme://host/images/sprite.png,缺少资产部分。如果我为
资产
切换
部分,效果很好,但我宁愿不这样做

我在这里发现了同样的问题:但这没有得到答案

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

感谢您的帮助,提前谢谢

旁注: 使用
@importurl(“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
,我将其保存到
文档目录/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*)请求缓存响应:(NSCachedURLResponse*)缓存响应客户端:(id)客户端

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"]];
终于修好了

我的
nsurl协议中包含以下内容:

- (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
    }
}
-(id)initWithRequest:(NSURLRequest*)请求缓存响应:(NSCachedURLResponse*)缓存响应客户端:(id)客户端{
self=[super initWithRequest:request cachedResponse:cachedResponse client:client];
如果(自我){
_lastReqURL=request.URL;
//一些东西
}
}

我只能假设NSURLResponse中的URL部分在处理相对路径时是关键的(似乎是合乎逻辑的)。

编辑了我的问题,但正如您现在看到的,不,我不是在本地使用loadHTMLString,而是在本地使用loadRequest。嘿,Nerkatel,请确保zipData写入文件路径时zip文件夹结构保持不变。我想,结构可能会丢失。你能在模拟器中验证这一点吗?我相信这个结构是保留的,我记录了以下内容:
索引9处的文件是“assets/css/main.css”
索引12处的文件是“assets/css/styles.css”
…使用
zip\u get\u num\u entries
libzip方法。我只是下载zip文件(已经压缩)并将其保存到文件路径,我不认为在这个过程中结构可能会丢失,是吗?嗯,我认为,因为保存它们时子文件夹不存在,可能有问题,文件会丢失吗?只需将zip的内容存储到文档的目录中,然后转到/Users/~user/Library/Application Support/iPhone Simulator/7.1-64/applications您对这个问题有什么类似的想法吗