DEV Community

Ting
Ting

Posted on

测试 iOS app 的后台行为

最近在开发中碰到用 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"
Enter fullscreen mode Exit fullscreen mode

可以把设备上之前10分钟的日志输出到桌面的 .logarchive 文件里,从而用 macOS 的 Console 控制台软件打开。

如何模拟后台运行

Eskimo 曾经写过一个很好的回答:https://developer.apple.com/forums/thread/14855

主要的几点:

  • 可以用 syscall exit(0) 来模拟类似挂起的“软退出”。在 iOS 上滑的后台管理界面里,如果你拖拽来杀后台的话,系统默认是“硬退出”,从而会导致后台任务被完全暂停;而如果只是上滑把程序放进后台,而不手动杀后台的话,系统会时不常分给程序一点儿后台时间,从而让后台下载数据的任务持续进行
  • 尽量用真实设备,而非模拟器来测试后台行为
  • 为了确保后台行为的可重复性,建议每次都删掉之前的测试 app ,或者手动清空数据,或者使用 invalidateAndCancel() 方法来重置 app 的状态

Top comments (0)