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
14 changes: 1 addition & 13 deletions .github/workflows/ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
with:
xcode-version: latest-stable

- name: Resolve build and test destinations
- name: Resolve build destination
run: |
DESTINATIONS="$(
xcodebuild \
Expand All @@ -43,14 +43,12 @@ jobs:
if [ -n "$SIMULATOR_ID" ]; then
echo "Using concrete iOS Simulator id=$SIMULATOR_ID"
echo "BUILD_DESTINATION=generic/platform=iOS Simulator" >> "$GITHUB_ENV"
echo "TEST_DESTINATION=platform=iOS Simulator,id=$SIMULATOR_ID" >> "$GITHUB_ENV"
exit 0
fi

if printf '%s\n' "$DESTINATIONS" | grep -F 'platform:macOS' | grep -F 'variant:Mac Catalyst' >/dev/null; then
echo "No concrete iOS Simulator destination found, falling back to Mac Catalyst"
echo "BUILD_DESTINATION=platform=macOS,variant=Mac Catalyst" >> "$GITHUB_ENV"
echo "TEST_DESTINATION=platform=macOS,variant=Mac Catalyst" >> "$GITHUB_ENV"
exit 0
fi

Expand All @@ -67,13 +65,3 @@ jobs:
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGNING_ALLOWED=NO

- name: Test with xcodebuild
run: |
xcodebuild test \
-scheme PhantomSwift \
-destination "$TEST_DESTINATION" \
-derivedDataPath "$RUNNER_TEMP/DerivedData-PhantomSwiftTests" \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGNING_ALLOWED=NO
13 changes: 12 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@ All notable changes to PhantomSwift will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.2.0] - 2026-08-02

### Changed
- ⚠️ **Minimum Runtime Raised**: PhantomSwift now requires iOS 13.0 or newer, which allows the package to use SF Symbols directly across the UI and removes the legacy emoji fallback path
- 🎨 **Icon System Cleanup**: Replaced remaining emoji-based UI icons with SF Symbol equivalents in the empty-state and logger surfaces

### Technical Notes
- **SemVer rationale**: Released as a minor version because the minimum supported platform changed, which is a breaking compatibility boundary for existing consumers
- **Release focus**: iOS 13 baseline, native iconography, and release metadata consistency
- **Recommended upgrade**: Consumers on `1.1.x` should move to `1.2.0` only if their app supports iOS 13 or newer

## [1.1.2] - 2026-07-05

### Added
Expand Down Expand Up @@ -107,7 +118,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- 🔧 **.gitignore**: Expanded from 43 to 120 lines with organized sections for Xcode, SPM, CocoaPods, Carthage, Fastlane, coverage tools, and IDEs

### Technical Details
- **Target**: iOS 12.0+ with #available guards for iOS 13+ APIs
- **Target**: iOS 13.0+ with `#available` guards for iOS 13+ APIs
- **Dependencies**: Zero external dependencies (Apple frameworks only)
- **Language**: Swift 5.0+ / Swift 5.9+ recommended
- **Architecture**: UIKit-first, programmatic UI layout (no storyboards/XIBs)
Expand Down
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import PackageDescription
let package = Package(
name: "PhantomSwift",
platforms: [
.iOS(.v12)
.iOS(.v13)
],
products: [
.library(
Expand Down
4 changes: 2 additions & 2 deletions PhantomSwift.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'PhantomSwift'
s.version = '1.1.2'
s.version = '1.2.0'
s.summary = 'Zero-dependency iOS debugging toolkit with 25 modules: network inspector, memory leak tracker, UI hierarchy, and more.'
s.description = <<-DESC
PhantomSwift is an open-source, zero-dependency iOS debugging library for Swift developers.
Expand All @@ -16,7 +16,7 @@ An alternative to FLEX, Netfox, and Pulse with no external dependencies required
s.author = { 'MRLF' => 'mrlf.synaptode@gmail.com' }
s.source = { :git => 'https://github.com/synaptode/PhantomSwift.git', :tag => "v#{s.version}" }

s.ios.deployment_target = '12.0'
s.ios.deployment_target = '13.0'
s.swift_version = '5.9'

s.source_files = 'Sources/PhantomSwift/**/*'
Expand Down
1,677 changes: 1,677 additions & 0 deletions PhantomSwift.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
</p>

<p align="center">
<a href="https://github.com/synaptode/PhantomSwift/releases/tag/v1.1.2">
<img src="https://img.shields.io/badge/version-1.1.2-blue.svg?style=flat" alt="Version 1.1.2">
<a href="https://github.com/synaptode/PhantomSwift/releases/tag/v1.2.0">
<img src="https://img.shields.io/badge/version-1.2.0-blue.svg?style=flat" alt="Version 1.2.0">
</a>
<a href="https://github.com/synaptode/PhantomSwift/blob/master/LICENSE">
<img src="https://img.shields.io/badge/License-MIT-green.svg?style=flat" alt="MIT License">
Expand All @@ -30,7 +30,7 @@
PhantomSwift is an open-source iOS debugging library for Swift developers.
It provides network inspection, memory leak detection, UI hierarchy exploration,
and 25+ diagnostic tools — all in a single zero-dependency package.
Compatible with UIKit and SwiftUI, installable via SPM or CocoaPods, with a minimum runtime target of iOS 12 and a validated Swift 5.9+ toolchain.
Compatible with UIKit and SwiftUI, installable via SPM or CocoaPods, with a minimum runtime target of iOS 13 and a validated Swift 5.9+ toolchain.
</p>

---
Expand Down Expand Up @@ -69,7 +69,7 @@ Compatible with UIKit and SwiftUI, installable via SPM or CocoaPods, with a mini

- **Zero external dependencies** — built entirely with Apple frameworks
- **`#if DEBUG` safe** — every file is wrapped; nothing ships to the App Store
- **iOS 12+ runtime support** — with `#available` guards for newer APIs
- **iOS 13+ runtime support** — with `#available` guards for newer APIs
- **Swift 5.x aligned** — validated with Swift 5.9+ toolchains
- **Glassmorphic UI** — premium dark theme with blur, shadows, and micro-animations
- **Modular architecture** — enable or disable any module independently
Expand Down Expand Up @@ -188,7 +188,7 @@ Or add it to your `Package.swift`:

```swift
dependencies: [
.package(url: "https://github.com/synaptode/PhantomSwift.git", from: "1.1.2")
.package(url: "https://github.com/synaptode/PhantomSwift.git", from: "1.2.0")
]
```

Expand All @@ -200,7 +200,7 @@ pod 'PhantomSwift', :configurations => ['Debug']

> **Important:** Always add PhantomSwift to your **Debug** configuration only. All code is wrapped in `#if DEBUG`, but restricting the dependency ensures zero bytes in release builds.
>
> **Compatibility:** PhantomSwift supports **iOS 12.0+** at runtime. The current package manifest and CocoaPods spec are validated with **Swift 5.9+** toolchains, which keeps the library within the Swift 5 generation while matching the repo's actual build settings.
> **Compatibility:** PhantomSwift supports **iOS 13.0+** at runtime. The current package manifest and CocoaPods spec are validated with **Swift 5.9+** toolchains, which keeps the library within the Swift 5 generation while matching the repo's actual build settings.

---

Expand Down Expand Up @@ -858,13 +858,13 @@ PhantomSwift.configure { config in

| Requirement | Minimum |
|-------------|---------|
| iOS | 12.0+ |
| iOS | 13.0+ |
| Swift | 5.9+ |
| Xcode | 15.0+ |
| Dependencies | None |

> **iOS Compatibility Notes:**
> - **iOS 12–12.x:** Core functionality works. SF Symbols replaced with text/Menlo fallbacks.
> - **iOS 13+:** Core functionality uses SF Symbols directly with no emoji fallbacks.
> - **iOS 13+:** Full SF Symbols, `UINavigationBarAppearance`, monospaced digit fonts.
> - **iOS 13+:** Remote WebSocket Server requires `Network.framework` (`NWListener`).
> - **iOS 14+:** OSLog bridge for unified logging.
Expand Down
24 changes: 24 additions & 0 deletions Resources/InfoPlists/PhantomSwift-Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
</dict>
</plist>
24 changes: 24 additions & 0 deletions Resources/InfoPlists/PhantomSwiftNetworking-Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright ©. All rights reserved.</string>
</dict>
</plist>
4 changes: 2 additions & 2 deletions Sources/PhantomSwift/HUD/PhantomDashboardVC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ internal final class PhantomDashboardVC: UIViewController {
private var sections: [AlphaSection] = []
private var lastVisibleSection = -1
private let emptyStateView = PhantomEmptyStateView(
emoji: "🔍",
symbolName: "magnifyingglass",
title: "No Results",
message: "No modules match your search."
)
Expand Down Expand Up @@ -167,7 +167,7 @@ internal final class PhantomDashboardVC: UIViewController {
// MARK: - Frosted glass background

private func setupFrostedBackground() {
// Deep dark base (fallback for iOS 12)
// Deep dark base for the dashboard backdrop.
view.backgroundColor = UIColor(white: 0.04, alpha: 1.0)

if #available(iOS 13.0, *) {
Expand Down
2 changes: 1 addition & 1 deletion Sources/PhantomSwift/HUD/PhantomFeatureCatalog.swift
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ internal enum PhantomFeatureCatalog {
vc.title = title
vc.view.backgroundColor = PhantomTheme.shared.backgroundColor

let emptyState = PhantomEmptyStateView(emoji: "ℹ️", title: title, message: message)
let emptyState = PhantomEmptyStateView(symbolName: "info.circle", title: title, message: message)
emptyState.translatesAutoresizingMaskIntoConstraints = false
vc.view.addSubview(emptyState)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ internal final class InterceptorListVC: UIViewController {
private let mockoonValueLabel = UILabel()
private var refreshTimer: Timer?
private let emptyView = PhantomEmptyStateView(
emoji: "🎭",
symbolName: "theatermasks",
title: "No active rules",
message: "Intercept or mock network traffic by adding a rule.",
style: .compact
Expand Down
2 changes: 1 addition & 1 deletion Sources/PhantomSwift/Modules/Logger/LogEntry.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public struct LogEntry: Identifiable {

/// Formatted log string for display.
public var formatted: String {
"[\(level.emoji) \(level.name)] \(message)"
"[\(level.name)] \(message)"
}
}
#endif
28 changes: 14 additions & 14 deletions Sources/PhantomSwift/Modules/Logger/LogLevel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ import Foundation

/// Priority levels for PhantomSwift logs.
public enum LogLevel: Int, CaseIterable {
/// 🔍 Granular technical details
/// Granular technical details
case verbose = 0
/// 🐛 General debug info
/// General debug info
case debug = 1
/// ℹ️ Normal app flow
/// Normal app flow
case info = 2
/// ⚠️ Unusual but non-fatal
/// Unusual but non-fatal
case warning = 3
/// Error requiring attention
/// Error requiring attention
case error = 4
/// 🚨 Fatal, potential crash
/// Fatal, potential crash
case critical = 5

/// User-friendly name
Expand All @@ -28,15 +28,15 @@ public enum LogLevel: Int, CaseIterable {
}
}

/// Associated emoji for visual cues
public var emoji: String {
/// Associated SF Symbol for visual cues
public var symbolName: String {
switch self {
case .verbose: return "🔍"
case .debug: return "🐛"
case .info: return "ℹ️"
case .warning: return "⚠️"
case .error: return ""
case .critical: return "🚨"
case .verbose: return "magnifyingglass"
case .debug: return "ladybug"
case .info: return "info.circle"
case .warning: return "exclamationmark.triangle"
case .error: return "xmark.octagon"
case .critical: return "exclamationmark.shield"
}
}
}
Expand Down
Loading
Loading