scfhao / sodownloader Goto Github PK
View Code? Open in Web Editor NEWA simple downloader base on AFNetworking
License: MIT License
A simple downloader base on AFNetworking
License: MIT License
SODownloadStateWait状态时会插入到downloadingArray中,变为SODownloadStateLoading时,还会再插入downloadingArray中。再问一下为何将NSMutableIndexSet注释掉换成了NSMutableArray来保存任务?
点击下载执行- (void)downloadItem:(id)item autoStartDownload:(BOOL)autoStartDownload 时,遇到内存问题闪退,截图如下:
开发环境:xCode 9.1 iPhone7 IOS 11.1 模拟器
还有不明白为何下面这两个数据对象为何要设置为 readonly ?
@Property (nonatomic, strong, readonly) NSMutableArray *downloadArrayWarpper;
@Property (nonatomic, strong, readonly) NSMutableArray *completeArrayWarpper;
我看前面有人提了个issue说可以断点下载,那进度不是应该从原来已经下好的进度开始吗?
Debug模式下报错:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<SWDGLoadMap 0x283072c70> valueForUndefinedKey:]: this class is not key value coding-compliant for the key fractionCompleted.'
Release模式完美运行, 为什么呢? 求解作者大大~
推荐时使用 kvo 进行监听, 那怎么同时拿到几个任务的速度总和?
这里就得使用定时器, 然后定时去获取了吧
您好:
我想在项目中使用您的SODownloader,但遇到了一个问题:
项目使用了自签名证书,下载地址是https协议的。
除了下载,项目其他https请求也是用的AFNetworking:
let sessionManager = AFHTTPSessionManager(baseURL: url)
sessionManager.securityPolicy = SHttp.securityPolicy()
通过配置SecurityPolicy来验证自签名证书,但是如果采用initWithSessionConfiguration来初始化AFHTTPSessionManager,正如SODownloader这样,程序会崩溃:
Terminating app due to uncaught exception 'Invalid Security Policy', reason: 'A security policy configured with AFSSLPinningModePublicKey
can only be applied on a manager with a secure base URL (i.e. https)'
所以改为用baseURL来初始化AFHTTPSessionManager,这样就可以运行了。
同样,在SODownloader中,我修改了SODownloader的初始化方法initWithIdentifier,传入SecurityPolicy也会出现这个错误。但是没有办法在初始化SODownloader单例时传入URL。所以想请教您有没有解决思路呢?
感谢!
期待您的回信。
Dabby
2019.5.16
- (void)applicationDidBecomeActive:(NSNotification *)notification {
double systemVersion = [[UIDevice currentDevice].systemVersion doubleValue];
if (systemVersion >= 12.0) {
[[NSNotificationCenter defaultCenter]postNotificationName:UIApplicationDidEnterBackgroundNotification object:nil];
}
}
谢谢!
查看源码得知
框架中注册applicationWillTerminate
的通知执行cancelByProducingResumeData
,但是applicationWillTerminate
这个方法是不执行子线程的任务的...
不知是否有好的解决方案
我在模拟器上测试 Demo 时,遇到程序产生异常的情况,这个异常在 AFNetworking的Issue
中可以找到记录。
我的测试步骤如下(非必现,如果你在测试过程中遇到同样的问题,请在下面评论):
但我在真机上测试 Demo 时,并未遇到该问题,如果你在真机上遇到这个问题,请在下方评论留言告知。
另外,我还发现一个真机与模拟器上后台下载的差别:
真机:iPhone SE、iOS 9.3.3
Xcode:Xcode 8.3.2,模拟器版本为iPhone 7 Plus - iOS 10.3(14E269)
真机效果:在真机上,将多个文件加入下载队列,后台下载完成一个文件后,会调用- application:handleEventsForBackgroundURLSession:completionHandler:
方法,进而触发下载队列中后续处于等待下载状态的文件开始下载。
iOS模拟器效果:在模拟器上下载完一个文件后并不调用上述AppDelegate
方法,而是出于暂停状态,把程序切回前台后才会继续下载队列中的其他文件。
基于上述的差异,我建议在测试后台下载时尽量使用真机进行测试。可能在不同的模拟器版本或iOS版本上的运行效果会有差异,如果你发现更多的情况,欢迎在下面进行留言。
在任务继续后,读取了临时文件 [url.md5].download 文件
目前测试在任务完成后没有移除这个暂停缓存的文件。
这个文件目前不删除好像有问题,我的操作是这样的:
下载成功后,我就吧成功的文件删除了,以后继续下载,这样每次完成的文件都是有问题的。
无网络时,还提示下载中状态,有没有办法提示下载失败或者其他处理呢?
当我们启动一个任务之后,暂停、取消或暂停再取消该任务的时候,该框架会调用cancelByProducingResumeData
来进行存储已经下载好的resumeData,并将其写入指定文件夹(文件以.download结尾),但是与于此同时AFNetworking中的NSURLSession也会随着cancelByProducingResumeData
生成一个tmp文件(CFNetworkDownload_cWZiWj.tmp 大概是这命名,后来发现是下载中的文件)。
若我们在任务进行的时候,暂停再取消、直接取消该任务的时候,框架会删除掉.download文件,却不会删除.tmp文件,而且.tmp文件也是挺大的(根据下载任务的大小决定)
发现直接调用downloadTask的cancel
方法可以移除.tmp文件,但是调用了cancelByProducingResumeData
,再调用cancel
是无效的。
原因是当任务暂停住的时候,取消该任务,没有清理掉已经下载好的部分。
SODownloader.m
52行处 添加 - (NSString *)resumePathForItem:(id<SODownloadItem>)item;
306行处 添加
BOOL res = [[NSFileManager defaultManager] removeItemAtPath:[self resumePathForItem:item] error:nil];
NSLog(@"%@", res ? @"沙盒删除成功" : @"沙盒删除失败");
您好:
很高兴您关闭了我上一次提交的issue
我在您的技术文档中看到您 对 AFNetworking 2.x 的支持做了相关的说明,不过我未找到您说的baseOnAF2
分支,您是不是已经取消了呢?还是我找错了?
因为使用的项目基于 AFNetworking 2.x
开发的,换到3.0的话改动的会很多
希望您将其填入,谢谢.
非常感谢您能公开这个下载库,我希望在以后的使用中能更好的与您互动.
1.下载视频给的网址是在模型里面的#pragma mark - SODownloadItem必须实现的方法
-(NSURL *)so_downloadURL{
NSSLog(@"%@",self.videoUrl);
return [NSURL URLWithString:[NSString stringWithFormat:@“”]];
}这个方法里面赋值的吗 运行出来是空的,这个如何赋值才能下载视频
3.我要想要在下载视频成功的时候保存到数据库这个过程 你这个下载要先给模型,有没有给出视频的链接像AF那样就可以下载了 然后拿到视频的数据,最后把模型以及视频的数据保存到数据库
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.