Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Security vulnerability
url: https://github.com/hideouts-io/iOS-Developer-Toolkit/security/advisories/new
url: https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/security/advisories/new
about: Report vulnerabilities privately. Do not open a public issue.
- name: Questions and usage help
url: https://github.com/hideouts-io/iOS-Developer-Toolkit/discussions
url: https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/discussions
about: Ask setup, compatibility, and workflow questions in Discussions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ jobs:
- name: Render every page at the default and minimum window sizes
run: |
scripts/check-layout.sh \
"$RUNNER_TEMP/dd/Build/Products/Debug/iOS Developer Toolkit.app/Contents/MacOS/iOS Developer Toolkit" \
"$RUNNER_TEMP/dd/Build/Products/Debug/iOS Developer Toolkit (Swift).app/Contents/MacOS/iOS Developer Toolkit (Swift)" \
"$RUNNER_TEMP/layout"
- uses: actions/upload-artifact@v7
if: always()
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ jobs:
run: |
sha256sum -c SHA256SUMS.txt
version="${GITHUB_REF_NAME#v}"
zip="release-assets/iOS-Developer-Toolkit-$version-macOS-universal.zip"
sbom="release-assets/iOS-Developer-Toolkit-$version.spdx.json"
zip="release-assets/iOS-Developer-Toolkit-Swift-$version-macOS-universal.zip"
sbom="release-assets/iOS-Developer-Toolkit-Swift-$version.spdx.json"
test -f "../$zip" && test -f "../$sbom"
echo "zip=$zip" >> "$GITHUB_OUTPUT"
echo "sbom=$sbom" >> "$GITHUB_OUTPUT"
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ mvt-analysis-*/
location-logs/
Location Logs/
iOS Developer Toolkit Location Logs/
iOS Developer Toolkit (Swift) Location Logs/
Live Logs/
Generated Routes/
location-events.jsonl
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion App/iOSDeveloperToolkit/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>iOS Developer Toolkit</string>
<string>iOS Developer Toolkit (Swift)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
Expand Down
4 changes: 2 additions & 2 deletions App/iOSDeveloperToolkit/Model/FeatureModels.swift
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ final class InstallModel {
@Observable
@MainActor
final class BackupModel {
var destination = URL.documents.appendingPathComponent("iOS Developer Toolkit Backups")
var destination = URL.documents.appendingPathComponent("\(ToolkitVersion.applicationName) Backups")
var forceFullBackup = false
var requireEncryption = true
var encryptionEnabled: Bool?
Expand Down Expand Up @@ -265,7 +265,7 @@ final class BackupModel {
@Observable
@MainActor
final class EvidenceModel {
var outputRoot = URL.documents.appendingPathComponent("iOS Developer Toolkit Cases")
var outputRoot = URL.documents.appendingPathComponent("\(ToolkitVersion.applicationName) Cases")
var options = CollectionOptions()
var caseTitle = ""
var casePurpose = ""
Expand Down
2 changes: 1 addition & 1 deletion App/iOSDeveloperToolkit/Model/LocationModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ final class LocationModel {
var lastSimulatedTarget: DeviceTarget?
private var playbackTask: Task<Void, Never>?

let evidenceDirectory = FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent("Documents/iOS Developer Toolkit Location Logs")
let evidenceDirectory = FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent("Documents/\(ToolkitVersion.applicationName) Location Logs")

init() {
// Screenshot mode shows sample places so personal saved places never appear in docs.
Expand Down
2 changes: 1 addition & 1 deletion App/iOSDeveloperToolkit/Model/ScreenshotHarness.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import ToolkitFeatures

/// Renders the app's own window for documentation and GUI verification:
///
/// "iOS Developer Toolkit" -capture-screenshots <folder>
/// "iOS Developer Toolkit (Swift)" -capture-screenshots <folder>
/// [-demo-mode] [-ui-testing] [-window-size WxH] [-only overview,apps]
/// [-populate-demo YES] [-select-booted-simulator YES] [-start-simulator-log YES]
/// [-scroll-fraction 0.0–1.0] [-show-sheet reconnect|shortcuts|advanced] [-select-physical-device YES]
Expand Down
2 changes: 1 addition & 1 deletion App/iOSDeveloperToolkit/iOSDeveloperToolkitApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ struct IOSDeveloperToolkitApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) private var delegate

var body: some Scene {
WindowGroup("iOS Developer Toolkit", id: "main") {
WindowGroup(ToolkitVersion.applicationName, id: "main") {
ContentView()
.environment(model)
.frame(minWidth: 900, minHeight: 560)
Expand Down
4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ title: "iOS Developer Toolkit"
type: software
authors:
- name: "hideouts-io"
repository-code: "https://github.com/hideouts-io/iOS-Developer-Toolkit"
url: "https://github.com/hideouts-io/iOS-Developer-Toolkit/releases/latest"
repository-code: "https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift"
url: "https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/releases/latest"
license: MIT
version: 1.0.0
abstract: "A native Swift/SwiftUI macOS app for iPhone, iPad, and simulator development and diagnostics: device readiness, live Unified and classic logs, location simulation, app installation, encrypted backups, packet capture, and hashed evidence collection."
Expand Down
2 changes: 1 addition & 1 deletion CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ This Code of Conduct applies within project spaces and when an individual offici

## Enforcement

Report abusive, harassing, or otherwise unacceptable behavior privately through the repository's [private report form](https://github.com/hideouts-io/iOS-Developer-Toolkit/security/advisories/new) and begin the summary with `Code of Conduct`. Reports will be reviewed by the project maintainer. The maintainer will respect the reporter's privacy and safety.
Report abusive, harassing, or otherwise unacceptable behavior privately through the repository's [private report form](https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/security/advisories/new) and begin the summary with `Code of Conduct`. Reports will be reviewed by the project maintainer. The maintainer will respect the reporter's privacy and safety.

Enforcement may include a private warning, removal of content, a temporary participation restriction, or a permanent ban, depending on impact and pattern of behavior.

Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ questions, and private vulnerability reporting for security issues.
Requirements: macOS 14 or later and Xcode 16 or later (Swift 6).

```bash
git clone https://github.com/hideouts-io/iOS-Developer-Toolkit.git
git clone https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift.git
cd iOS-Developer-Toolkit
swift build
swift test
Expand Down Expand Up @@ -71,7 +71,7 @@ Also, when relevant:
automation) and render every page at the default and minimum sizes, as CI does:

```bash
scripts/check-layout.sh "…/iOS Developer Toolkit.app/Contents/MacOS/iOS Developer Toolkit" /tmp/layout
scripts/check-layout.sh "…/iOS Developer Toolkit (Swift).app/Contents/MacOS/iOS Developer Toolkit (Swift)" /tmp/layout
```

It fails if any page is squeezed, overflows the window, or does not render; the PNGs are in
Expand Down
5 changes: 3 additions & 2 deletions MIGRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ itself) · 🟡 migrated and tested against the protocol-accurate fake device or
needs physical-device verification · 🔁 replaced by a different Apple-supported mechanism · ❌ not
migrated (see §6) or removed

> The Python app is not discontinued: it continues as the 0.x line on the `python` branch (see
> the README). This document covers how its features map to the Swift app (1.x) on `main`.
> The Python app is not discontinued: it continues as **iOS Developer Toolkit** in
> [hideouts-io/iOS-Developer-Toolkit](https://github.com/hideouts-io/iOS-Developer-Toolkit). This document covers how its features map to
> this Swift app, **iOS Developer Toolkit (Swift)**.

## 1. Audit of the Python application (v0.3.4)

Expand Down
37 changes: 18 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# iOS Developer Toolkit
# iOS Developer Toolkit (Swift)

<p align="center">
<img src="App/iOSDeveloperToolkit/Assets.xcassets/Logo.imageset/logo.png" width="200" alt="iOS Developer Toolkit logo">
<img src="App/iOSDeveloperToolkit/Assets.xcassets/Logo.imageset/logo.png" width="200" alt="iOS Developer Toolkit (Swift) logo">
</p>

**A native macOS app for working with iPhones, iPads, and simulators — device information, live logs, location simulation, app installs, backups, packet capture, readiness checks, and documented evidence collection.**

[![CI](https://github.com/hideouts-io/iOS-Developer-Toolkit/actions/workflows/ci.yml/badge.svg)](https://github.com/hideouts-io/iOS-Developer-Toolkit/actions/workflows/ci.yml)
[![Latest release](https://img.shields.io/github/v/release/hideouts-io/iOS-Developer-Toolkit?display_name=tag)](https://github.com/hideouts-io/iOS-Developer-Toolkit/releases/latest)
[![CI](https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/actions/workflows/ci.yml/badge.svg)](https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/actions/workflows/ci.yml)
[![Latest release](https://img.shields.io/github/v/release/hideouts-io/iOS-Developer-Toolkit-Swift?display_name=tag)](https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/releases/latest)
![Platform](https://img.shields.io/badge/macOS-14%2B-000000?logo=apple&logoColor=white)
![Swift](https://img.shields.io/badge/Swift-6-F05138?logo=swift&logoColor=white)
[![License](https://img.shields.io/badge/license-MIT-2da44e)](LICENSE)
Expand Down Expand Up @@ -114,8 +114,8 @@ The Command Line Tools alone are not enough for the Xcode column: `devicectl`, `

### Download a release

1. Download `iOS-Developer-Toolkit-VERSION-macOS-universal.zip` and `SHA256SUMS.txt` from the
[latest release](https://github.com/hideouts-io/iOS-Developer-Toolkit/releases/latest).
1. Download `iOS-Developer-Toolkit-Swift-VERSION-macOS-universal.zip` and `SHA256SUMS.txt` from the
[latest release](https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/releases/latest).
2. Verify the download:

```bash
Expand All @@ -125,16 +125,16 @@ The Command Line Tools alone are not enough for the Xcode column: `devicectl`, `
Optionally verify GitHub's build attestation:

```bash
gh attestation verify iOS-Developer-Toolkit-VERSION-macOS-universal.zip --repo hideouts-io/iOS-Developer-Toolkit
gh attestation verify iOS-Developer-Toolkit-Swift-VERSION-macOS-universal.zip --repo hideouts-io/iOS-Developer-Toolkit-Swift
```

3. Unzip it and move **iOS Developer Toolkit.app** to `/Applications`.
3. Unzip it and move **iOS Developer Toolkit (Swift).app** to `/Applications`.
4. Release builds are ad-hoc signed and not notarized, so macOS asks for confirmation the first
time. Control-click the app, choose **Open**, and confirm. If there is no Open button, go to
**System Settings › Privacy & Security** and choose **Open Anyway**. Do not disable Gatekeeper.

Nothing else needs to be installed. The release also contains `idt`, the command-line tool, at
`iOS Developer Toolkit.app/Contents/MacOS/idt`.
`iOS Developer Toolkit (Swift).app/Contents/MacOS/idt`.

### Build it yourself

Expand Down Expand Up @@ -170,7 +170,7 @@ No device handy? Turn on **Device › Demo Mode** to explore every workspace wit
- **Install App** — inspect an `.ipa` (or choose a simulator `.app`), see whether the device is in
the provisioning profile, then install.
- **Location Lab** — coordinates, map, saved places (stored only on this Mac), routes, GPX playback.
Location events are appended to `~/Documents/iOS Developer Toolkit Location Logs/location-events.jsonl`.
Location events are appended to `~/Documents/iOS Developer Toolkit (Swift) Location Logs/location-events.jsonl`.
- **Live Logs** — several concurrent streams; pop out any stream into its own window.
- **Actions** — the guided action catalog and Advanced Mode.
- **Backup** — encryption status and setup, full or incremental backups.
Expand Down Expand Up @@ -300,7 +300,7 @@ More detail: [docs/troubleshooting.md](docs/troubleshooting.md).
Requirements: macOS 14+, Xcode 16 or later (Swift 6).

```bash
git clone https://github.com/hideouts-io/iOS-Developer-Toolkit.git
git clone https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift.git
cd iOS-Developer-Toolkit

swift test # unit and integration tests
Expand All @@ -326,7 +326,7 @@ xcodebuild -project iOSDeveloperToolkit.xcodeproj -scheme iOSDeveloperToolkit \
Documentation screenshots are produced by the app itself:

```bash
"iOS Developer Toolkit.app/Contents/MacOS/iOS Developer Toolkit" \
"iOS Developer Toolkit (Swift).app/Contents/MacOS/iOS Developer Toolkit (Swift)" \
-demo-mode YES -populate-demo YES -window-size 1180x700 -capture-screenshots ~/Desktop/shots
```

Expand All @@ -338,18 +338,17 @@ See [docs/architecture.md](docs/architecture.md).

## Project status and limitations

Version 1.0 is a complete rewrite of the earlier Python/PySide6 app (0.3.x), which depended on
Version 1.0 is a native rewrite of the Python/PySide6 app ([iOS Developer Toolkit](https://github.com/hideouts-io/iOS-Developer-Toolkit), 0.3.x), which depends on
`pymobiledevice3`. See [MIGRATION.md](MIGRATION.md) for the feature-by-feature mapping. Workspace
profiles exported by 0.3.x can be imported in **Settings › Profiles**; the preview explains how each
setting carries over.

### The Python app (0.x)
### The Python app

The Python/PySide6 app is still maintained, as a separate line: it is developed on the
[`python`](https://github.com/hideouts-io/iOS-Developer-Toolkit/tree/python) branch and released as
`v0.x` ([0.x releases](https://github.com/hideouts-io/iOS-Developer-Toolkit/releases?q=v0.&expanded=true),
with separate Apple silicon and Intel builds). It uses `pymobiledevice3` and Python; this app (1.x)
needs neither. Workspace profiles move between them: 1.x imports profiles exported by 0.x.
The Python/PySide6 app, **iOS Developer Toolkit**, is maintained separately in
[hideouts-io/iOS-Developer-Toolkit](https://github.com/hideouts-io/iOS-Developer-Toolkit), with its releases. It uses `pymobiledevice3` and
Python; this app needs neither. The two install side by side and keep their data in separate
folders, and this app imports workspace profiles exported by the Python app.

- The native lockdown services (logs, packet capture, backup, diagnostics, app installation over
USB, developer-image checking and mounting including Apple personalization) are tested end to
Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

## Report a vulnerability privately

Use [GitHub private vulnerability reporting](https://github.com/hideouts-io/iOS-Developer-Toolkit/security/advisories/new).
Use [GitHub private vulnerability reporting](https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/security/advisories/new).
Do not disclose a suspected vulnerability in a public issue, discussion, pull request, log,
screenshot, or evidence archive.

Expand Down
4 changes: 2 additions & 2 deletions SOURCE_AVAILABILITY.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Source availability

Every published release of iOS Developer Toolkit is built from a Git tag in
[this public repository](https://github.com/hideouts-io/iOS-Developer-Toolkit) by the release
[this public repository](https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift) by the release
workflow, with a GitHub build-provenance attestation that links the archive to that workflow run
and commit. GitHub provides source archives for each tag, or:

```bash
git clone --branch vVERSION --depth 1 https://github.com/hideouts-io/iOS-Developer-Toolkit.git
git clone --branch vVERSION --depth 1 https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift.git
```

The app is written in Swift. Its third-party dependencies are Swift packages resolved from their
Expand Down
2 changes: 1 addition & 1 deletion SUPPORT.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Support

Use [GitHub Discussions](https://github.com/hideouts-io/iOS-Developer-Toolkit/discussions) for
Use [GitHub Discussions](https://github.com/hideouts-io/iOS-Developer-Toolkit-Swift/discussions) for
installation, pairing, Developer Mode, developer services, compatibility, and workflow questions.

Before asking:
Expand Down
2 changes: 1 addition & 1 deletion Sources/DeviceKit/Services/MobileBackup2.swift
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ public enum MobileBackup2 {
"GUID": .string(UUID().uuidString.replacingOccurrences(of: "-", with: "")),
"Last Backup Date": .date(Date()),
"iTunes Version": "12.13.0",
"Backup Tool": "iOS Developer Toolkit",
"Backup Tool": .string(ToolkitVersion.applicationName),
]
let mapping = [
"Device Name": "DeviceName", "Display Name": "DeviceName", "Product Type": "ProductType",
Expand Down
4 changes: 3 additions & 1 deletion Sources/ToolkitCore/ToolkitVersion.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,7 @@ import Foundation
/// the app's Info.plist.
public enum ToolkitVersion {
public static let current = "1.0.0"
public static let applicationName = "iOS Developer Toolkit"
/// The app's name. It also names its folders (caches, Application Support, and the default
/// Documents folders), which keeps them apart from the Python app's "iOS Developer Toolkit" folders.
public static let applicationName = "iOS Developer Toolkit (Swift)"
}
2 changes: 1 addition & 1 deletion Sources/ToolkitFeatures/Evidence/CaseWorkflow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public enum CaseWorkflow {
let folder = try createCaseFolder(in: root, target: target, at: now)
let document: [String: Any] = [
"schema_version": 2,
"application": "iOS Developer Toolkit",
"application": ToolkitVersion.applicationName,
"case": try JSONSerialization.jsonObject(with: JSONOutput.encode(intake)),
"limitations": [
"The intake records the operator acknowledgement; it does not establish chain of custody.",
Expand Down
2 changes: 1 addition & 1 deletion Sources/ToolkitFeatures/Evidence/EvidenceCollector.swift
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public enum CollectionOutcome: String, Codable, Sendable {

public struct CollectionManifest: Codable, Sendable {
public var schemaVersion = 2
public var application = "iOS Developer Toolkit"
public var application = ToolkitVersion.applicationName
public var applicationVersion: String
public var targetUDID: String
public var targetName: String
Expand Down
2 changes: 1 addition & 1 deletion Sources/ToolkitFeatures/LiveLogs/LogCapture.swift
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ public actor LogCapture {
private var closed = false

public static func defaultDirectory(home: URL = FileManager.default.homeDirectoryForCurrentUser) -> URL {
home.appendingPathComponent("Library/Caches/iOS Developer Toolkit/Live Logs")
home.appendingPathComponent("Library/Caches/\(ToolkitVersion.applicationName)/Live Logs")
}

public init(kind: LogStreamKind, target: DeviceTarget, directory: URL = LogCapture.defaultDirectory(), now: Date = Date()) throws {
Expand Down
4 changes: 2 additions & 2 deletions Sources/ToolkitFeatures/Location/LocationLab.swift
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ public enum LocationLab {
formatter.formatOptions = [.withInternetDateTime]
var lines = [
#"<?xml version="1.0" encoding="UTF-8"?>"#,
#"<gpx version="1.1" creator="iOS Developer Toolkit" xmlns="http://www.topografix.com/GPX/1/1">"#,
#"<gpx version="1.1" creator="iOS Developer Toolkit (Swift)" xmlns="http://www.topografix.com/GPX/1/1">"#,
" <trk><name>Toolkit QA route</name><trkseg>",
]
for (index, point) in points.enumerated() {
Expand Down Expand Up @@ -224,7 +224,7 @@ public enum LocationLab {
// MARK: Saved locations (same JSON schema as earlier releases)

public static func savedLocationsURL(home: URL = FileManager.default.homeDirectoryForCurrentUser) -> URL {
home.appendingPathComponent("Library/Application Support/iOS Developer Toolkit/locations.json")
home.appendingPathComponent("Library/Application Support/\(ToolkitVersion.applicationName)/locations.json")
}

public static func validateLocationName(_ name: String) throws -> String {
Expand Down
Loading
Loading