标签: nsurlcache

iOS中奇怪的WebThread崩溃

我在网络线程中遇到了一个奇怪的崩溃,发布了一个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)

exc-bad-access objective-c nsurlcache ios

5
推荐指数
0
解决办法
1576
查看次数

NSURLCache不在iOS 7中存储缓存数据

下面给出的代码适用于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中运行的原因是什么?

iphone objective-c nsurlcache ios ios7

5
推荐指数
1
解决办法
1489
查看次数

为什么NSURLSession不使用我配置的NSURLCache?

iOS7带来NSURLSessionNSURLSessionConfigure,我们可以自定义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)

caching objective-c nsurlcache ios7 nsurlsession

5
推荐指数
1
解决办法
4579
查看次数

NSURLCache不能与UIWebVIew脱机工作

我正在尝试使用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返回的数据无法加载。

iphone objective-c uiwebview nsurlcache ios

5
推荐指数
0
解决办法
2351
查看次数

如何使用缓存策略NSURLRequestReloadRevalidatingCacheData

下面的链接

iOS-仅在修改后下载文件(NSURL和NSData)

http://nshipster.com/nsurlcache/

提到NSURLRequestReloadRevalidatingCacheData尚未在iOS 7中实现。

这是在iOS 12中实现的吗?如果是,您能告诉我如何使用吗?

如果不是,在使用服务器之前针对服务器验证缓存的替代方法/最佳实践是什么?

谢谢!

caching nsurlcache ios afnetworking ios12

5
推荐指数
1
解决办法
1487
查看次数

在Swift框架中的应用程序和扩展之间共享NSURLCache的实例

我想NSURLCache在我的应用程序和扩展程序之间共享一个实例,因此尝试从Swift框架中实例化它.

有没有办法在共享(容器)磁盘空间上生成URL缓存?

nsurlcache swift

5
推荐指数
0
解决办法
157
查看次数

加密NSURLCache的更好方法是什么?

我想加密/解密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)

nsurlcache nsurlprotocol ios nsurlsession alamofire

5
推荐指数
1
解决办法
556
查看次数

AFNetworking中UIImageView的磁盘备份图像缓存

我想AFImageCacheUIImageView+AFNetworking类别中更换默认使用的东西,这是基于磁盘的,并且可以更准确地管理(类似于NSURLCache).不幸的是,既然UIImageView+AFNetworking是一个类别而不是子类,我不能用另一个类别的子类覆盖af_sharedImageCacheUIImageView.

有没有其他方法来实现这个功能,而无需复制和粘贴大部分内容UIImageView+AFNetworking到我自己的子类中?

objective-c nsurlcache ios afnetworking

4
推荐指数
1
解决办法
5867
查看次数

NSURLCache,设置自定义键

我正在使用NSURLCache,我想为NSURLRequest设置自定义密钥.那可能吗?

完整说明:

我正在开发一个使用OpenStreetMap图块的地图应用程序.OpenStreetMap提供多个服务器来为磁贴提供服务,以减少每台服务器的负载.我随机使用这些服务器.例如,以下网址将提供相同的图块:

显然,它会给我的缓存带来一些问题,因为如果我从服务器A缓存一个磁贴,下次,如果我尝试从服务器B加载,NSURLCache将找不到该磁贴.

所以,我想自己设置缓存键,以便处理这种情况.那可能吗?

nsurlcache ios

4
推荐指数
1
解决办法
496
查看次数

iOS URLCache缓存时不应该(恕我直言)

有谁知道为什么这个请求被缓存?

  • 我正在使用未经修改的.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)

caching nsurlcache ios nsurlsession

4
推荐指数
1
解决办法
432
查看次数