最近在开发中碰到用 SwiftUI 的 backgroundTask(_:action:)
修饰符来实现“真后台”下载数据的功能。代码实现本身就已经有点儿绕了,而测试更是令人挠头。主要在于 iOS 和其他桌面操作系统相比,最初就没有想着如何精确控制后台程序的行为,导致很多的行为都是靠操作系统自己来协调。因此,测试起来也颇费一番周折。
在测试过程中,我们发现了一些小的技巧,在此记录一二。
打印日志
iOS 14 引入的 OSLog
库能够让我们用现代而高效的日志来刻画程序运行状态。通过创建一个由环境变量控制的 Logger
,我们可以在 debug build 里打出更多日志,而毋需影响 release build。
导出日志
iOS app 的后台行为之所以难测,是因为一旦程序被操作系统挂起、进入所谓“假死”、“软退出”的状态后,Xcode 的 debugger 就不再和程序连接在一起了。因此,也没法通过看 debugger 的输出来决定程序目前到底处在什么状态、下载数据下载到多少。
这个时候我们就需要把在真实设备上运行的程序日志,输出到电脑上查看。通过以下的命令
sudo log collect --device-name "My iPhone" --last 10m --output "~/Desktop"
可以把设备上之前10分钟的日志输出到桌面的 .logarchive
文件里,从而用 macOS 的 Console 控制台软件打开。
如何模拟后台运行
Eskimo 曾经写过一个很好的回答:https://developer.apple.com/forums/thread/14855
主要的几点:
- 可以用 syscall
exit(0)
来模拟类似挂起的“软退出”。在 iOS 上滑的后台管理界面里,如果你拖拽来杀后台的话,系统默认是“硬退出”,从而会导致后台任务被完全暂停;而如果只是上滑把程序放进后台,而不手动杀后台的话,系统会时不常分给程序一点儿后台时间,从而让后台下载数据的任务持续进行 - 尽量用真实设备,而非模拟器来测试后台行为
- 为了确保后台行为的可重复性,建议每次都删掉之前的测试 app ,或者手动清空数据,或者使用
invalidateAndCancel()
方法来重置 app 的状态
Top comments (0)