通过检测URL方案替换本地资源

时间:2011-09-09 07:45:41

标签: iphone ios cocoa-touch http

我已经构建了一个类,通过继承UIWebView并覆盖NSURLCache来拦截cachedResponseForRequest:资源加载,类似于this示例。基本上,如果请求的资源是.css类型,我在本地缓存目录中查找它,如果找到,我加载本地版本。

问题是我现在希望能够通过提供我的应用知道的特定方案来指定在本地缓存中查找哪些css文件。但是,当我将计划更改为:

 myapp://www.myhost.com/static/default.css

然后在加载html时不再调用cachedResponseForRequest:。有谁知道为什么这个,或者我如何使用特定方案为我的网址启用此方法?

1 个答案:

答案 0 :(得分:1)

关键是注册自己的NSURLProtocol子类,它可以响应您的自定义方案以加载这些特殊资源。我使用了以下两种方法:

#pragma mark - Public

+ (void)enable {
    [NSURLProtocol registerClass:[MyAppURLProtocol class]];
}

#pragma mark - NSURLProtocol Overridden methods

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    NSString *urlScheme = [[request URL] scheme];
    return [urlScheme isEqualToString:@"myapp"];
}

要注册,请从应用代表处拨打[MyAppURLProtocol enable]。您还需要覆盖NSURLProtocol reference中定义的所有其他必需方法,这最终会迫使您自己加载数据。

有必要注册您自己的网址协议的原因是documented by apple

  

URL加载系统设计允许客户端应用程序扩展   支持传输数据的协议。网址   加载系统本身支持http,https,文件和ftp协议。

     

自定义协议是通过继承NSURLProtocol然后实现的   使用URL注册URL加载系统的新类   NSURLProtocol类方法registerClass:...