iOS 服务器文件有修改才进行下载
来源:互联网 发布:同济大学软件研究生 编辑:程序博客网 时间:2024/05/01 00:19
当要下载的文件会定期修改,而且比较大时,可以在文件有修改的时候,才进行下载。
有两种方式
一、需要服务器支持304状态码(推荐)
请求中带上 If-Modified-Since 字段,如果在这个时间后,文件有修改,则返回200状态码,以及文件内容。如果文件没有修改,则返回304状态码,文件内容不会返回
+(void)downloadFileIfUpdatedWithLocalPath:(NSString*)path url:(NSString*)urlStr{ if(path.length == 0 || urlStr.length == 0) return; // 保存文件最后修改时间的Key NSString *lastModifyKey = KeyLastModify([urlStr MD5]); // 获取上次得到的文件最后修改时间 NSString *lastModifyLocal = [[NSUserDefaults standardUserDefaults] objectForKey:lastModifyKey]; NSURL *url = [NSURL URLWithString:urlStr]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"GET"]; [request setValue:lastModifyLocal forHTTPHeaderField:@"If-Modified-Since"]; NSURLSessionDownloadTask *task = [[NSURLSession sharedSession] downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { if(!error) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if(httpResponse.statusCode == 200) { NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *fileDir = [path stringByDeletingLastPathComponent]; if(![fileManager fileExistsAtPath:fileDir]) { // 创建目录 [fileManager createDirectoryAtPath:fileDir withIntermediateDirectories:YES attributes:nil error:nil]; } NSData *fileData = [NSData dataWithContentsOfURL:location]; if ([fileData writeToFile:path atomically:YES]) { // 存储文件的最后修改时间 NSString *lastModifyServer = [[httpResponse allHeaderFields] objectForKey:@"Last-Modified"]; [[NSUserDefaults standardUserDefaults] setObject:lastModifyServer forKey:lastModifyKey]; } } else if(httpResponse.statusCode == 304) { NSLog(@"无需更新%@",[path lastPathComponent]); } } }]; [task resume];}
二、不需要服务器支持304状态码
1、通过HEAD请求获取文件的最后修改时间
2、与本地存储的文件最后修改时间进行比较
3、如果有更新,则直接请求文件
下面方法需要放到异步队列中执行,否则会阻塞主线程
+(void)downloadFileIfUpdatedWithLocalPath:(NSString*)path url:(NSString*)urlStr{ BOOL download = NO; NSURL *url = [NSURL URLWithString:urlStr]; NSDate *lastModifiedLocal = nil; NSDate *lastModifiedServer = nil; // 询问服务器是否有修改 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"HEAD"]; NSHTTPURLResponse *response; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL]; if ([response respondsToSelector:@selector(allHeaderFields)]) { NSString *lastModifiedString = [[response allHeaderFields] objectForKey:@"Last-Modified"]; NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'"; df.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; lastModifiedServer = [df dateFromString:lastModifiedString]; } // 查看本地存储 NSFileManager *fileManager = [NSFileManager defaultManager]; if ([fileManager fileExistsAtPath:path]) { NSError *error = nil; NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:path error:&error]; lastModifiedLocal = [fileAttributes fileModificationDate]; } if (!lastModifiedLocal || [lastModifiedLocal laterDate:lastModifiedServer] == lastModifiedServer) { download = YES; } if(download) { NSData *data = [NSData dataWithContentsOfURL:url]; if (data) { NSString *dirPath = [path stringByDeletingLastPathComponent]; NSError *error = nil; if(![fileManager fileExistsAtPath:dirPath]) { [fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:&error]; } if ([data writeToFile:path atomically:YES]) { NSLog(@"Downloaded file saved to: %@", path); } if (lastModifiedServer) { NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:lastModifiedServer forKey:NSFileModificationDate]; if ([fileManager setAttributes:fileAttributes ofItemAtPath:path error:&error]) { NSLog(@"File modification date updated"); } if (error) { NSLog(@"Error setting file attributes for: %@ - %@", path, [error localizedDescription]); } } } }}
比较
方式一:
1、不管文件是否需要更新,都只有一次请求;
2、最后修改时间的比较,都由服务器处理,App无需关心时间的格式
方式二:
1、文件不需要更新时,只有一次请求。文件需要更新时,一共有两次请求;
2、最后修改时间由App比较,需要关心时间格式。一旦时间格式改变,就会有问题
0 0
- iOS 服务器文件有修改才进行下载
- iOS 服务器文件有修改才进行下载
- 中间有跳板机,mac电脑如何与服务器之间进行上传与下载文件
- IOS 从服务器下载文件
- GlassFish搭建服务器进行文件下载测试
- ios开发之-从服务器下载文件
- 在网上下载好的PDF文件怎么进行修改
- FlashFXP定时下载服务器文件,进行网站备份
- C#上传(修改表单数据),下载文件到服务器
- ios开发网络篇 - 使用ASI框架进行文件下载
- iOS中利用NSURLSession进行文件断点下载
- iOS中利用NSURLSession进行文件断点下载
- iOS中利用NSURLSession进行文件断点下载
- ios从服务器下载文件到应用当中
- 文件下载(已修改)
- 文件压缩\修改\下载
- iOS关于使用NSURLSession进行大文件下载以及断点下载
- 下载服务器文件
- hbase_2_good
- 常见的Android 内存泄漏问题
- span margin is not working
- Cmake 编译opengl开源库glfw工程及使用
- 先做个小计划吧
- iOS 服务器文件有修改才进行下载
- iOS录音,调用麦克风话筒
- C#入门9.13——类的多态
- PHP学习:函数
- struts.xml(一)的<action-mappings>标签详解
- Fragment异常:Binary XML file line XXX: Error inflating class fragment
- 看到一张比较好的关于特征工程的图
- CodeForces-710A. King Moves
- 计算机网络-传输层