在 Swift 中控制模拟器...
SimulatorServices 提供了一个易于使用的 API,用于管理、查询和访问您 Mac 上的模拟器。
Apple 平台
Linux
使用 Swift Package Manager 通过仓库 URL 安装此库
https://github.com/brightdigit/SimulatorServices.git
使用最高 1.0.1
的版本。
SimulatorServices 允许您直接在 Swift 中执行 simctl
的子命令,同时提供易于使用的 API 来解析和传递参数。
SimulatorServices 使用 SimCtl
对象来传递子命令。 每个子命令对象都接受自定义参数或属性,并且可以将标准输出解析为易于使用的 Swift 对象。 目前支持两个子命令:GetAppContainers
和 List
。
List
子命令使您能够提取设备、设备类型、运行时和设备对的列表。 例如,假设您要提取所有已启动的可用设备
let simctl = SimCtl()
let list = try await simctl.run(List())
let devices = list.devices.values
.flatMap { $0 }
.filter{$0.state == "Booted"}
有关可用属性的更多详细信息,请查看 SimulatorList
上的文档。
在这种情况下,我们可以更进一步,找到这些不同模拟器设备的应用程序容器目录。
通过我们的设备模拟器列表,我们可以使用 GetAppContainer
子命令来查找特定路径。 在这种情况下,让我们找到应用程序 com.BrightDigit.Jojo.watchkitapp
的 *data* 目录
let jojoSimulatorDataDirPaths: [Path] = await withTaskGroup(of: Path?.self) { taskGroup in
for device in devices {
taskGroup.addTask {
do {
return try await simctl.run(
GetAppContainer(
appBundleIdentifier: "com.BrightDigit.Jojo.watchkitapp",
container: .data,
// use the udid of the device to indicate which simulator to pull from
simulator: .id(device.udid)
)
)
// if the data is missing that means that device does not contain that app container
} catch GetAppContainer.Error.missingData {
return nil
} catch {
return nil
}
}
}
return await taskGroup.reduce(into: [Path]()) { paths, path in
// essential this does a compactMap on results
if let path {
paths.append(path)
}
}
}
有关可用参数的更多详细信息,请查看 List
上的文档。
虽然现在这个软件包只支持两个子命令,**但是**有两种方法可以支持更多的子命令
Subcommand
的 pull request有关如何实现新的 Subcommand
的详细信息,请查看现有命令上的代码,并查看 Subcommand
协议的文档。
有很多关于 simctl
复杂性的优秀文章。 我强烈推荐这些文章,它们帮助我构建了这个包
还可以看看这些利用 simctl
功能的优秀应用程序
此代码根据 MIT 许可证分发。 有关更多信息,请参见 LICENSE 文件。