SimulatorServices

SimulatorServices

在 Swift 中控制模拟器...

SwiftPM Twitter GitHub GitHub issues GitHub Workflow Status

Codecov CodeFactor Grade codebeat badge Code Climate maintainability Code Climate technical debt Code Climate issues Reviewed by Hound

目录

简介

SimulatorServices 提供了一个易于使用的 API,用于管理、查询和访问您 Mac 上的模拟器。

要求

Apple 平台

Linux

安装

使用 Swift Package Manager 通过仓库 URL 安装此库

https://github.com/brightdigit/SimulatorServices.git

使用最高 1.0.1 的版本。

Simulator Services 提供什么?

SimulatorServices 允许您直接在 Swift 中执行 simctl 的子命令,同时提供易于使用的 API 来解析和传递参数。

用法

SimulatorServices 使用 SimCtl 对象来传递子命令。 每个子命令对象都接受自定义参数或属性,并且可以将标准输出解析为易于使用的 Swift 对象。 目前支持两个子命令:GetAppContainersList

列出模拟器

List 子命令使您能够提取设备、设备类型、运行时和设备对的列表。 例如,假设您要提取所有已启动的可用设备

let simctl = SimCtl()
let list = try await simctl.run(List())
let devices = list.devices.values
    .flatMap { $0 }
    .filter{$0.state == "Booted"}

有关可用属性的更多详细信息,请查看 SimulatorList 上的文档。

在这种情况下,我们可以更进一步,找到这些不同模拟器设备的应用程序容器目录。

获取 App 容器

通过我们的设备模拟器列表,我们可以使用 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 的详细信息,请查看现有命令上的代码,并查看 Subcommand 协议的文档。

了解更多关于 simctl 的信息

有很多关于 simctl 复杂性的优秀文章。 我强烈推荐这些文章,它们帮助我构建了这个包

优秀的模拟器 App

还可以看看这些利用 simctl 功能的优秀应用程序

许可证

此代码根据 MIT 许可证分发。 有关更多信息,请参见 LICENSE 文件。