Latest 0.1.2
Homepage https://github.com/SYFH/FKDownloader
License MIT
Platforms ios 8.0, requires ARC
Authors

FKDonwloader

Support
[Language]()
Carthage Compatible
CocoaPods Compatible
FKDownloader

👍🏻📥也许是最好的文件下载器.

Features

  • [x] 后台下载
  • [x] 恢复所有后台任务和进度
  • [x] 自管理任务持久化
  • [x] 使用配置实例统一配置
    • [x] 可配置是否为后台下载
    • [x] 可配置是否允许蜂窝网络下载
    • [x] 可配置自动开始/自动清理
    • [x] 可配置并行任务数量
    • [x] 可配置自定义保存/缓存/恢复目录
    • [x] 可配置超时时间
    • [x] 可配置是否进行文件校验
  • [x] 使用 NSProgress 管理任务进度
  • [x] 所有任务总进度
  • [x] 任务实时速度和预计剩余时间
  • [x] 文件校验, 支持 MD5/SHA1/SHA256/SHA512, 并对特大文件校验进行了内存优化
  • [x] 自定义文件名
  • [x] 任务可添加多个 Tag, 并通过 Tag 进行分组
  • [x] 通过 Tag 获取组任务进度
  • [x] 状态与进度数据可通过代理/通知/Block任意获取
  • [x] 网络状态检测, 恢复网络时自动开始被中断的任务
  • [x] 没有使用任何第三方
  • [x] 自启动, 无需显式调用
  • [x] 兼容 Swift
  • [x] 更简单的调用
  • [x] 更详细的任务状态: 无/预处理/等待/进行中/完成/取消/暂停/恢复/校验/错误

初衷与动机

一个系统BUG引发的血案

简单使用 — ObjC

  • 任务管理
// 批量添加任务, 数组元素支持 NSString, NSURL, NSDictionary, NSMutableDictionary
[[FKDownloadManager manager] addTaskWithArray:urls];

// 批量添加任务并分配 tag
[[FKDownloadManager manager] addTaskWithArray:urls tag:@"group_task_01"];

// 开始执行任务
[[FKDownloadManager manager] start:@"URL"];

// 根据 URL 获取任务
[[FKDownloadManager manager] acquire:@"URL"];

// 暂停任务
[[FKDownloadManager manager] suspend:@"URL"];

// 恢复任务
[[FKDownloadManager manager] resume:@"URL"];

// 取消任务
[[FKDownloadManager manager] cancel:@"URL"];

// 移除任务
[[FKDownloadManager manager] remove:@"URL"];

// 设置任务代理
[[FKDownloadManager manager] acquire:@"URL"].delegate = self;

// 设置任务 Block
[[FKDownloadManager manager] acquire:@"URL"].statusBlock = ^(FKTask *task) {
    // 状态改变时被调用
};
[[FKDownloadManager manager] acquire:@"URL"].speedBlock = ^(FKTask *task) {
    // 下载速度, 默认 1s 调用一次
};
[[FKDownloadManager manager] acquire:@"URL"].progressBlock = ^(FKTask *task) {
    // 进度改变时被调用
};
  • 支持的任务通知
// 与代理同价, 可按照代理的使用方式使用通知.
extern FKNotificationName const FKTaskPrepareNotification;
extern FKNotificationName const FKTaskDidIdleNotification;
extern FKNotificationName const FKTaskWillExecuteNotification;
extern FKNotificationName const FKTaskDidExecuteNotication;
extern FKNotificationName const FKTaskProgressNotication;
extern FKNotificationName const FKTaskDidResumingNotification;
extern FKNotificationName const FKTaskWillChecksumNotification;
extern FKNotificationName const FKTaskDidChecksumNotification;
extern FKNotificationName const FKTaskDidFinishNotication;
extern FKNotificationName const FKTaskErrorNotication;
extern FKNotificationName const FKTaskWillSuspendNotication;
extern FKNotificationName const FKTaskDidSuspendNotication;
extern FKNotificationName const FKTaskWillCancelldNotication;
extern FKNotificationName const FKTaskDidCancelldNotication;
extern FKNotificationName const FKTaskSpeedInfoNotication;
extern FKNotificationName const FKTaskWillRemoveNotification;
extern FKNotificationName const FKTaskDidRemoveNotification;
  • 需要在 AppDelegate 中调用的
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler {

    // 保存后台下载所需的系统 Block, 区别 identifier 以防止与其他第三方冲突
    if ([identifier isEqualToString:[FKDownloadManager manager].configure.sessionIdentifier]) {
        [FKDownloadManager manager].configure.backgroundHandler = completionHandler;
    }
}

简单使用 — Swift

  • 任务管理
// 批量添加任务, 数组元素支持 NSString, NSURL, NSDictionary, NSMutableDictionary
Downloader.shared().addTasks(with: urls)

// 批量添加任务并分配 tag
Downloader.shared().addTasks(with: urls, tag: "group_task_01")

// 开始执行任务
Downloader.shared().start("URL")

// 根据 URL 获取任务
Downloader.shared().acquire("URL")

// 暂停任务
Downloader.shared().suspend("URL")

// 恢复任务
Downloader.shared().resume("URL")

// 取消任务
Downloader.shared().cancel("URL")

// 移除任务
Downloader.shared().remove("URL")

// 设置任务代理
Downloader.shared().acquire("URL")?.delegate = self

// 设置任务 Block
Downloader.shared().acquire("URL")?.statusBlock = { (task) in
    // 状态改变时被调用
}
Downloader.shared().acquire("URL")?.progressBlock = { (task) in
    // 下载速度, 默认 1s 调用一次
}
Downloader.shared().acquire("URL")?.speedBlock = { (task) in
    // 进度改变时被调用
}
  • 支持的任务通知
// 与代理同价, 可按照代理的使用方式使用通知.
extension NSNotification.Name {

    public static let FKTaskPrepare: NSNotification.Name

    public static let FKTaskDidIdle: NSNotification.Name

    public static let FKTaskWillExecute: NSNotification.Name

    public static let FKTaskDidExecute: NSNotification.Name

    public static let FKTaskProgress: NSNotification.Name

    public static let FKTaskDidResuming: NSNotification.Name

    public static let FKTaskWillChecksum: NSNotification.Name

    public static let FKTaskDidChecksum: NSNotification.Name

    public static let FKTaskDidFinish: NSNotification.Name

    public static let FKTaskError: NSNotification.Name

    public static let FKTaskWillSuspend: NSNotification.Name

    public static let FKTaskDidSuspend: NSNotification.Name

    public static let FKTaskWillCancelld: NSNotification.Name

    public static let FKTaskDidCancelld: NSNotification.Name

    public static let FKTaskSpeedInfo: NSNotification.Name

    public static let FKTaskWillRemove: NSNotification.Name

    public static let FKTaskDidRemove: NSNotification.Name
}
  • 需要在 AppDelegate 中调用的
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {

    if identifier == Downloader.shared().configure.sessionIdentifier {
        Downloader.shared().configure.backgroundHandler = completionHandler
    }
}

示例/最佳实践

请直接运行 Demo.
  

安装

  • CocoaPods
      pod 'FKDownloader'
  • Carthage
      github 'SYFH/FKDownloader'
  • Manual
      将FKDownloader 文件夹复制到项目中, #import "FKDownloader.h" 即可开始

关于

如果觉得好用, 可以 Star 哟~
如果觉得功能不如人意, 请尽情的 Fork!
如果使用中出现了问题, 请直接提交 issues!
  

MIT License

Copyright (c) 2018 Norld

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Latest podspec

{
    "name": "FKDownloader",
    "version": "0.1.2",
    "summary": "ud83dudc4dud83cudffbud83dudce5Maybe the best file downloader.",
    "homepage": "https://github.com/SYFH/FKDownloader",
    "license": "MIT",
    "authors": {
        "norld": "[email protected]"
    },
    "platforms": {
        "ios": "8.0"
    },
    "source": {
        "git": "https://github.com/SYFH/FKDownloader.git",
        "tag": "0.1.2"
    },
    "source_files": [
        "FKDownloader",
        "FKDownloader/*.{h,m}"
    ],
    "exclude_files": "FKDownloader/*.plist",
    "requires_arc": true
}

Pin It on Pinterest

Share This