下载管理器所做的事情是网络浏览器所不做的
一个 4GB 的文件,完成了 90%,然后一个电话——或者只是一个锁定的屏幕——它就消失了。这是在 iOS 上下载时最常见的抱怨,但它不是一个错误。这是操作系统完全按照其设计目的进行的操作,也是存在单独一类应用程序的原因。
- 30秒 暂停的应用程序在 iOS 停止之前大约会继续运行多长时间
- 206 使恢复成为可能的 HTTP 状态
- 1字节 重新下载了多少正确恢复的传输
为什么切换应用程序时传输会停止
iOS 不会仅仅因为应用程序愿意而让其继续运行。当您离开某个应用程序时,它会在几秒钟内挂起,并且挂起的应用程序没有 CPU 时间,没有网络套接字,也无法注意到它已停止。它在内存中保存的所有内容仍然存在,但被冻结了——如果系统需要内存,应用程序会在没有通知的情况下直接终止。
因此,在应用程序内的普通连接上运行的下载以主页手势结束。有些应用程序通过要求额外几秒钟的后台时间来隐藏这一点,这就是为什么下载有时会在后台存活下来,只要您注意到它没有。
正确的答案是不同的。 iOS 提供了后台传输服务:您向系统提供 URL 和目的地列表,系统会按照自己的时间表在自己的进程中自行下载。您的应用程序可以暂停、终止或根本不运行 - 传输会继续,并且当有需要报告的情况时,应用程序会在后台重新启动。这是每次在锁定屏幕后仍然存在的下载背后的机制,使用它是应用程序预先做出的设计决策,而不是您可以打开的设置。
决定下载是否存活的四种机制
- 范围请求
- 请求 5,000,000 字节以上而不是整个文件的 HTTP 请求。如果服务器回答“206 Partial Content”,则可以从中间恢复;如果它回答“200 OK”并从头开始,则不是 - 文件必须从零开始再次获取。
- 并行连接
- 将一个文件拆分为多个范围并同时获取它们。它很有帮助,因为单个连接通常会受到服务器的限制或受到往返延迟的限制,而不是因为打开的套接字越多,您的互联网速度就越快。
- 已提交偏移量
- 有多少文件已安全写入磁盘,而不是仍在运行中。从最后提交的字节恢复的下载是正确的;一个从它“认为”收到的内容恢复的文件会产生一个损坏的文件,该文件仅在数小时后才显露出来。
- 后台会话
- 系统运行转移如上所述。它启动速度较慢,无法提供任意的自定义逻辑,并且它是应用程序不运行时唯一保持运行的东西。
下载失败的原因以及每次失败的情况
大多数“卡住下载”报告都是这五种之一,一旦您了解形状,就很容易区分它们。
| 你所看到的 | 实际发生了什么 | 有什么帮助 |
|---|---|---|
| 在您离开应用程序时停止 | 传输是在进程中运行的,而不是在后台会话中运行。 | 你无法从外部做任何事情——这是一个应用程序设计问题。 |
| 每次都从0%重新启动 | 服务器忽略范围请求,因此无法从中间继续。 | 稳定的连接,或者较小的文件。某些主机仅允许签名链接的范围。 |
| 几分钟后失败,反复 | 链接已过期。许多主机发出的 URL 有效期为五到十分钟。 | 再次从其页面获取链接并重新开始;旧的永远不会工作。 |
| 下载速度很快,然后文件打不开 | 到达的是 HTML 错误页面或带有视频文件名的登录页面。 | 检查大小 — 14 KB 的“电影”是一个网页。在提交之前检查链接。 |
| 尽管连接速度很快,但速度还是很慢 | 服务器端的每个连接限制。 | 更多并行连接(如果服务器允许)。如果它通过 IP 地址而不是套接字进行限制,则没有任何帮助。 |
当根本没有文件可供下载时
网络上的大部分视频不是以文件形式提供的。它以 HLS 的形式提供 - 一个“.m3u8”播放列表,其中列出了数百个小片段,每个片段几秒钟,通常具有多个质量级别,以便播放器可以随着连接的变化进行切换。没有单一的 URL 保存该影片,因为该影片仅作为序列存在。
保存一个意味着获取每个片段,然后重新混合它们:将视频和音频流写入普通的 MP4 容器。没有任何内容被重新编码,因此没有任何内容丢失,并且只需要几秒钟而不是电影的长度。结果是一个可以在任何地方播放的普通文件。
这也是为什么“下载此流”的启动时间比下载文件要长得多:必须获取并解析播放列表,选择质量级别,然后片段才能开始到达。这就是为什么有些流根本无法保存的原因——如果片段在 DRM 方案下加密,则故意无法获取密钥,并且任何尊重法律的工具都无法克服这一点。
真正的下载管理器与下载按钮的区别
应用程序关闭后它仍然存在
后台传输移交给系统,切换从相同的已提交字节继续,而不是再次启动文件。
它会在您提交之前告诉您链接是什么
大小、类型以及服务器是否支持恢复 — 所有这些都可以通过单个 HEAD 请求得知,并且在您花费 4 GB 的数据计划之前都非常有用。
它排队而不是洪水
一次十个文件比一次三个文件慢,因为每个连接获得的份额较小,并且故障会成倍增加。具有合理并发限制的队列会更快完成。
落地的是普通文件
在一个文件夹中,您可以看到,命名合理,可以由任何东西播放 - 而不是只有该应用程序可以打开的数据库 blob。
避免大多数下载问题的习惯
- 在 Wi-Fi 上启动大文件并在前几秒钟保持屏幕打开
切换到后台会话会提前进行;之后屏幕就不再重要了。
- 不要一次排队二十个项目
三到五个并发传输是几乎每个连接的最佳选择。
- 检查之前而不是之后的可用空间
填充磁盘的传输在达到 98% 时失败,iOS 可能已经清除了您的缓存以腾出空间。
- 以怀疑的态度对待瞬间的“完成”
一部在两秒内结束的电影就是一个错误页面。查看文件大小。
- 从他们的页面重新获取过期的链接
无论应用程序重试多少次,重试死签名 URL 将永远失败。
这在不同设备上有何不同
由此引发的问题
连接数越多就意味着下载速度越快吗?
不会。当服务器限制每个单独连接的速度时(这种情况很常见),它们会有所帮助。当限制是您自己的连接时,它们什么也不做,并且当主机计算每个 IP 地址的套接字数并开始拒绝它们时,它们会使事情变得更糟。有用的范围在 4 到 8 之间。三十是适得其反的。
屏幕锁定时可以继续下载吗?
是的,如果交给系统后台传输服务的话。锁定屏幕与该服务无关——重要的是被暂停的应用程序,而该机制的全部要点是无论如何它都会继续运行。
为什么我的下载会重新启动而不是继续?
服务器不接受范围请求。你可以看出,因为进度回到零而不是回升。有些主机仅在其签名的下载 URL 上支持范围,有些主机完全禁用它们,还有一些主机支持小文件但不支持大文件。
将流转换为 MP4 与重新编码相同吗?
不会。重新混合将现有视频和音频原封不动地转移到 MP4 容器中 — 无损,而且速度足够快,可以在几秒钟内完成。重新编码会使用不同的编解码器重建图像,并且总是会损失质量。如果保存两个小时的流需要两个小时,则某些内容在不需要时重新编码。
FoxDL如何下载
该引擎有两个通道:一个是进程内通道,当应用程序在屏幕上时速度很快,另一个是系统后台会话,当应用程序不在屏幕上时,系统后台会话将从同一字节接管。
- 单个文件的并行块,直接写入磁盘上的最终位置,而不是写入随后必须连接的临时部分。
- 后台传输在应用程序离开屏幕后继续,并在最后提交的偏移量处拾取 - 而不是应用程序认为它拥有的最后一个字节。
- 在断开、重新启动或强制退出后恢复,前提是服务器满足范围请求。如果没有,FoxDL 会这样说而不是循环。
- HLS 流重新混合为 MP4,因此到达库中的是普通文件,而不是片段的文件夹。
- 下载检查器,在您开始之前报告链接的实际大小、类型和恢复支持。
- 所有内容都位于文件应用程序可以看到的普通文件夹中。
免费额度因平台而异:在 iPhone 和 iPad 上,少量通行证可通过您自己开始的奖励短视频充值;在 Mac 上,根本没有广告,每日固定计数。 Pro 消除了对每台设备的限制。