我在网络线程中遇到了一个奇怪的崩溃,发布了一个URLResponse.我没有直接操作URLCache的内容,那么这个问题可能是什么原因呢?
这是崩溃日志供参考:
Incident Identifier: E4116BAA-7467-42F8-B28E-7A1FA2D12278
CrashReporter Key: dcaac993b4bfa7e5015f07b0ffc611182b196e57
Hardware Model: iPad2,1
Process: *** [6299]
Path: /var/mobile/Applications/
Identifier: ***
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2012-06-25 11:11:59.347 +0800
OS Version: iPhone OS 5.0.1 (9A405)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x42810008
Crashed Thread: 2
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 libsystem_kernel.dylib 0x30367010 mach_msg_trap + 20
1 libsystem_kernel.dylib 0x30367206 mach_msg + 50
2 CoreFoundation 0x37cea41c __CFRunLoopServiceMachPort + 120 …Run Code Online (Sandbox Code Playgroud) 下面给出的代码适用于iOS 6,但它不适用于iOS 7.
NSCachedURLResponse cachedURLResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:data userInfo:nil storagePolicy:NSURLCacheStorageAllowed];
[[NSURLCache sharedURLCache] storeCachedResponse:cachedURLResponse forRequest:request];
NSLog(@"Cached response is %@", [[NSURLCache sharedURLCache] cachedResponseForRequest:request]);
Run Code Online (Sandbox Code Playgroud)
在iOS 6中,我获得了缓存的响应数据,但在iOS 7中,它返回null.我使用以下命令在App委托中设置了NSURLCache对象:
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:2 * 1024 * 1024
diskCapacity:2 * 1024 * 1024
diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];
Run Code Online (Sandbox Code Playgroud)
缓存无法在iOS 7中运行的原因是什么?
iOS7带来NSURLSession了NSURLSessionConfigure,我们可以自定义URLCache,所以我尝试了,但没有运气,似乎我的URLCache根本没用过.
- (void)testURLCache
{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1024 * 100 diskCapacity:1024 * 100 diskPath:@"test.urlcache"];
NSLog(@"usage:%lu", (unsigned long)[cache currentDiskUsage]);
config.URLCache = cache;
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
for (int i = 0; i < 40; i++) {
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js?%d", i]]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"error:%@", error);
} else {
NSLog(@"done:%d", i); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用NSURLCache中的数据离线加载UIWebView。
-(BOOL)应用程序:(UIApplication *)应用程序didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//设置缓存
int cacheSizeMemory = 4 * 1024 * 1024; // 4MB
int cacheSizeDisk = 32 * 1024 * 1024; // 32MB
NSURLCache * urlCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@“ nsurlcache”]];
[NSURLCache setSharedURLCache:urlCache];
}
-(无效)loadWebView {
request = [NSURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:1000];
[self.webView loadRequest:request];
}
当我尝试离线加载UIWebView时,它将调用didFailWithError而不是connectionDidFinishLoading。但是,我的Cache目录包含脱机数据和资源,例如CSS,JS文件,但UIWebView无法访问它。
我已经通过重写以下方法来确认这一点:
-(NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
NSCachedURLResponse *响应= [超级cachedResponseForRequest:请求];
if([response.data length]> 0){
//所有css,js脚本文件都会调用
NSLog(@“从缓存中返回数据”);
}
返回响应;
}
此外,从缓存UIWebview返回的数据无法加载。
下面的链接
http://nshipster.com/nsurlcache/
提到NSURLRequestReloadRevalidatingCacheData尚未在iOS 7中实现。
这是在iOS 12中实现的吗?如果是,您能告诉我如何使用吗?
如果不是,在使用服务器之前针对服务器验证缓存的替代方法/最佳实践是什么?
谢谢!
我想NSURLCache在我的应用程序和扩展程序之间共享一个实例,因此尝试从Swift框架中实例化它.
有没有办法在共享(容器)磁盘空间上生成URL缓存?
我想加密/解密NSURLSession使用AES256的所有缓存数据.我是使用Alamofire的新手,但我认为可以在不涉及图书馆本身的情况下进行.
我不确切知道在缓存之前加密数据的最无缝方式是什么,并在从缓存中检索后对其进行解密.
我看我可以使用Alamofire的SessionDelegate和方法dataTaskWillCacheResponse,并dataTaskWillCacheResponseWithCompletion进行加密,但我没有看到从缓存中做解密所提取的数据有关的任何东西.
另一方面,我正在考虑NSURLProtocol重写的自定义,cachedResponse但我没有看到与该响应的缓存有关的任何内容,只有提取的数据.
总而言之,我不知道是否有可能实现这一点,或者我必须在NSURLSessionDelegate/SessionDelegate和之间使用混合NSURLProtocol,或者可能使用子类NSURLCache来完成工作并将其传递给Alamofire会话,或者有更简单的东西,或者我非常错误:P
任何帮助将非常感激.
我正试图通过下一个实现来实现它.首先是缓存的一个非常简单的子类:
class EncryptedURLCache: URLCache {
let encryptionKey: String
init(memoryCapacity: Int, diskCapacity: Int, diskPath path: String? = nil, encryptionKey: String) {
guard !encryptionKey.isEmpty else {
fatalError("No encryption key provided")
}
self.encryptionKey = encryptionKey
super.init(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: path)
}
override func cachedResponse(for request: URLRequest) -> CachedURLResponse? {
objc_sync_enter(self)
defer { objc_sync_exit(self) }
return super.cachedResponse(for: request)?.cloneDecryptingData(withKey: …Run Code Online (Sandbox Code Playgroud) 我想AFImageCache在UIImageView+AFNetworking类别中更换默认使用的东西,这是基于磁盘的,并且可以更准确地管理(类似于NSURLCache).不幸的是,既然UIImageView+AFNetworking是一个类别而不是子类,我不能用另一个类别的子类覆盖af_sharedImageCacheUIImageView.
有没有其他方法来实现这个功能,而无需复制和粘贴大部分内容UIImageView+AFNetworking到我自己的子类中?
我正在使用NSURLCache,我想为NSURLRequest设置自定义密钥.那可能吗?
完整说明:
我正在开发一个使用OpenStreetMap图块的地图应用程序.OpenStreetMap提供多个服务器来为磁贴提供服务,以减少每台服务器的负载.我随机使用这些服务器.例如,以下网址将提供相同的图块:
显然,它会给我的缓存带来一些问题,因为如果我从服务器A缓存一个磁贴,下次,如果我尝试从服务器B加载,NSURLCache将找不到该磁贴.
所以,我想自己设置缓存键,以便处理这种情况.那可能吗?
有谁知道为什么这个请求被缓存?
我正在使用未经修改的.default URLSessionConfiguration.
响应标头是:
(来自Charles,通过调试数据任务完成块中的响应确认)
{
"Accept-Ranges" = bytes;
"Content-Length" = 1480;
"Content-Type" = "application/json";
Date = "Mon, 22 May 2017 19:14:13 GMT";
Etag = "\"42bebc5fb88323b8cd145ed85ea7a018\"";
"Last-Modified" = "Mon, 22 May 2017 14:54:38 GMT";
Server = AmazonS3;
"x-amz-id-2" = "abcdefghijklmn";
"x-amz-request-id" = 1A2B3C4D5E;
}
Run Code Online (Sandbox Code Playgroud)
我正在验证使用Charles代理缓存请求 - 第一个请求出现,但后续请求没有.
使用.ephemeral会话配置,或者为内存和磁盘大小设置自定义url缓存为0显示Charles中的所有请求,因此我知道Charles是一个有效的测试.
我一直认为没有缓存标头不会缓存响应:|
任何人的想法?
编辑:这是我正在提出的要求
po task.originalRequest
? Optional<URLRequest>
? some : http://s3-eu-west-1.amazonaws.com/path/path/configuration.json
? url : Optional<URL>
? some : http://s3-eu-west-1.amazonaws.com/path/path/configuration.json
- cachePolicy : 0
- timeoutInterval : 60.0
- …Run Code Online (Sandbox Code Playgroud) nsurlcache ×10
ios ×8
objective-c ×5
caching ×3
nsurlsession ×3
afnetworking ×2
ios7 ×2
iphone ×2
alamofire ×1
ios12 ×1
swift ×1
uiwebview ×1