Giter Club home page Giter Club logo

tiercel's Introduction

Version Platform Language SPM Support License

Tiercel 是一个简单易用、功能丰富的纯 Swift 下载框架,支持原生级别后台下载,拥有强大的任务管理功能,可以满足下载类 APP 的大部分需求。

如果你使用的开发语言是 Objective-C ,可以使用 TiercelObjCBridge 进行桥接

Tiercel 3.0

Tiercel 3.0 大幅提高了性能,拥有更完善的错误处理,提供了更多方便的 API。从 Tiercel 2.0 升级到 Tiercel 3.0 是很简单的,强烈推荐所有开发者都进行升级,具体请查看 Tiercel 3.0 迁移指南

特性

  • 支持原生级别的后台下载
  • 支持离线断点续传,App 无论 crash 还是被手动 Kill 都可以恢复下载
  • 拥有精细的任务管理,每个下载任务都可以单独操作和管理
  • 支持创建多个下载模块,每个模块互不影响
  • 每个下载模块拥有单独的管理者,可以对总任务进行操作和管理
  • 支持批量操作
  • 内置了下载速度、剩余时间等常见的下载信息
  • 支持自定义日志
  • 支持下载任务排序
  • 链式语法调用
  • 支持控制下载任务的最大并发数
  • 支持文件校验
  • 线程安全

环境要求

  • iOS 10.0+
  • Xcode 11.0+
  • Swift 5.0+

安装

CocoaPods

Tiercel 支持 CocoaPods 集成,首先需要使用以下命令安装 CocoaPod:

$ gem install cocoapods

Podfile文件中

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!

target '<Your Target Name>' do
    pod 'Tiercel'
end

最后运行命令

$ pod install

Swift Package Manager

从 Xcode 11 开始,集成了 Swift Package Manager,使用起来非常方便。Tiercel 也支持通过 Swift Package Manager 集成。

在 Xcode 的菜单栏中选择 File > Swift Packages > Add Pacakage Dependency,然后在搜索栏输入

[email protected]:Danie1s/Tiercel.git,即可完成集成

手动集成

Tiercel 也支持手动集成,只需把本项目文件夹中的Tiercel文件夹拖进需要集成的项目即可

Demo

打开本项目文件夹中 Tiercel.xcodeproj ,可以直接运行 Demo

用法

基本用法

一行代码开启下载

// 创建下载任务并且开启下载,同时返回可选类型的DownloadTask实例,如果url无效,则返回nil
let task = sessionManager.download("http://dldir1.qq.com/qqfile/QQforMac/QQ_V4.2.4.dmg")

// 批量创建下载任务并且开启下载,返回有效url对应的任务数组,urls需要跟fileNames一一对应
let tasks = sessionManager.multiDownload(URLStrings)

可以对任务设置状态回调

let task = sessionManager.download("http://dldir1.qq.com/qqfile/QQforMac/QQ_V4.2.4.dmg")

task?.progress(onMainQueue: true) { (task) in
    let progress = task.progress.fractionCompleted
    print("下载中, 进度:\(progress)")
}.success { (task) in
    print("下载完成")
}.failure { (task) in
    print("下载失败")
}

可以通过 URL 对下载任务进行操作,也可以直接操作下载任务

let URLString = "http://dldir1.qq.com/qqfile/QQforMac/QQ_V4.2.4.dmg"

// 通过 URL 对下载任务进行操作
sessionManager.start(URLString)
sessionManager.suspend(URLString)
sessionManager.cancel(URLString)
sessionManager.remove(URLString, completely: false)

// 直接对下载任务进行操作
sessionManager.start(task)
sessionManager.suspend(task)
sessionManager.cancel(task)
sessionManager.remove(task, completely: false)

后台下载

从 Tiercel 2.0 开始支持原生的后台下载,只要使用 Tiercel 开启了下载任务:

  • 手动 Kill App,任务会暂停,重启 App 后可以恢复进度,继续下载
  • 只要不是手动 Kill App,任务都会一直在下载,例如:
    • App 退回后台
    • App 崩溃或者被系统关闭
    • 重启手机

如果想了解后台下载的细节和注意事项,可以查看:iOS 原生级别后台下载详解

文件校验

Tiercel 提供了文件校验功能,可以根据需要添加,校验结果在回调的task.validation

let task = sessionManager.download("http://dldir1.qq.com/qqfile/QQforMac/QQ_V4.2.4.dmg")
// 回调闭包可以选择是否在主线程上执行
task?.validateFile(code: "9e2a3650530b563da297c9246acaad5c",
                   type: .md5,
                   onMainQueue: true)
                   { (task) in
    if task.validation == .correct {
        // 文件正确
    } else {
        // 文件错误
    }
}

更多

有关 Tiercel 3.0 的详细使用方法和升级迁移,请查看 Wiki

License

Tiercel is available under the MIT license. See the LICENSE file for more info.

tiercel's People

Contributors

agedpomelo avatar danie1s avatar mustangym avatar rain2540 avatar recherst avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tiercel's Issues

arm64

打包出错:
Undefined symbols for architecture arm64:
"protocol witness table for Swift.Int64 : Tiercel.TiercelCompatible in Tiercel", referenced from:
大神这个不支持arm64吗?

success block里怎么获取文件本地地址?

如题 , 回调回来是 TRTask , 不能直接回来download task吗? 而且, success 不应该是下载成功的回调吗? 我看demo中, 还在success 里判断status? 其他任何状态都应该是 faild回调呀

fileExists 判断异常

Cache.swift

public func fileExists(fileName: String) -> Bool {
    guard let path = filePath(fileName: fileName) else { return false }
    return fileManager.fileExists(atPath: path)
}

这里判断文件用 fileExists 返回是true但文件打不开(下载的图片在File中显示为0B 且打不开但是显示下载成功)
建议用 isExecutableFile 判断

关于suspend和cancelByProducingResumeData的优缺点

我之前一般是使用suspend暂停,然后resume恢复。
如果出错调用了 didCompleteWithError,我再获取resumeData重新创建下载。
suspend 相比 cancelByProducingResumeData 有其他的什么坑吗,之前没遇到过。
suspend一般手动kill app 就会调用 didCompleteWithError。

session.invalidateAndCancel() 问题

public var configuration = TRConfiguration() { didSet { guard !shouldCreatSession else { return } shouldCreatSession = true if status == .running { runningTasks = tasks.filter { $0.status == .running } waitingTasks = tasks.filter { $0.status == .waiting } totalSuspend() } else { session.invalidateAndCancel() } } }

对 configuration 赋值后,就没有机会创建新的 session,也就不能创建任务了吧

下载总大小异常

下载demo查看下载功能,单个文件下载,将url替换成本地的,下载正常,但是task.progress.totalUnitCount = -1

日期转换似乎有误

计算的下载完成时间比实际时间大了8小时
eg:实际 11:04 完成,计算获得时间为 19:04

看了下代码,似乎是转换时间时增加 3600 * 8 导致的,去掉后正常

public func convertTimeToDateString() -> String {
        // 此处为何要加 3600 * 8?
        let time = base + 3600 * 8
        let date = Date(timeIntervalSince1970: time)
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return formatter.string(from: date)
}

arm64

真机提示这个错误
Undefined symbols for architecture arm64:
"protocol witness table for Swift.Int64 : Tiercel.TiercelCompatible in Tiercel", referenced from:
麻烦大佬看一下

考虑移除文件名前缀 `TR`

这种命名方式是 OC 语言风格的产物,Swift 中都是按模块划分的,移除更 swifty 。
使用时,已经有 tr 了,所以更不需要这样的命名风格。
建议考虑一下。

能否考虑将manager中task的存储方式改为字典?

首先非常感谢大佬开源这个下载器源码。
看到源码中多处都是使用遍历匹配的方式来获取task,感觉换成字典性能应该会好很多。(强迫症)
或者说这样写是出于怎样的考虑呢?

疑问:是否可以后台下载任务完成后创建新的后台下载任务

问题1:下载的任务是大量小的且有依赖性的,例:A>B>C>D; 创建后台下载任务A,当A任务在后台完成下载后,是否可以创建新的后台下载任务B? (尝试这样做后发现新的后台下载任务B启动下载的时机不确定,不是立刻而是一段时间后)。
问题2:如果不可以后台下载完成后再创建新的后台任务,那么在前台时需要把所有的后台下载任务先创建出来,上限是多少?

示例demo打包报错

您好 下载您的demo示例打包之后显示的错误为:
Undefined symbols for architecture armv7:
"protocol witness table for __ObjC.UIDevice : Tiercel.TiercelCompatible in Tiercel", referenced from:
Demo.BaseViewController.viewDidLoad() -> () in BaseViewController.o
"protocol witness table for Swift.Int64 : Tiercel.TiercelCompatible in Tiercel", referenced from:
function signature specialization <Arg[0] = Owned To Guaranteed> of Demo.ViewController1.(updateUI in _5C5E94575650EAFC2B93D94793CAD274)(Tiercel.TRTask) -> () in ViewController1.o
麻烦可以看一下吗?谢谢

Xcode beta5,tr报错

Swift 4,Cocoapods 集成环境下

'tr' is inaccessible due to 'internal' protection level

有循环引用,造成内存泄露

public class TRSessionDelegate: NSObject {
public weak var manager: TRManager?
}

此处是否应该用weak来修饰manager? 不然会造成循环引用,请追查一下。

New logo/icon proposal

Good day sir. I am a graphic designer and i am interested in designing a logo for your good project. I will be doing it as a gift for free. I just need your permission first before I begin my design. Hoping for your positive feedback. Thanks

when downloading crach ,this is the log

iPhone system - iOS10.3

moveItem error: Error Domain=NSCocoaErrorDomain Code=516 "“CFNetworkDownload_J1VtL6.tmp” couldn’t be moved to “OM

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An instance 0x131d38b10 of class __NSCFBackgroundDownloadTask was deallocated while key value observers were still registered with it. Current observation info: <NSKeyValueObservationInfo 0x1744344c0> (
<NSKeyValueObservance 0x174056b60: Observer: 0x131d07ab0, Key path: currentRequest, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x174653f50>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.