Skip to content

Toolset · Swift, SwiftUI, Swift Concurrency

iOS

  • Swift
  • SwiftUI
  • async/await

Modern iOS is Swift + SwiftUI with structured concurrency. We lean on the platform where it's strong (URLSession, Codable, Keychain) and add libraries only where they earn their place.

Where two tools compete, the one marked our default is what we reach for.

01

Build & dependencies

2 tools

First-party dependency manager, integrated into Xcode. Our default — no extra tooling.

Mature dependency manager; still needed for a few libraries that lag on SPM support.

02

Dependency injection

2 tools
Factoryour default

Modern, compile-safe DI with a tiny footprint and SwiftUI-friendly property wrappers. Our default.

extension Container {
    var apiClient: Factory<APIClient> { self { APIClient() } }
    var userRepo: Factory<UserRepository> { self { UserRepository() } }
}

// use it:
@Injected(\.userRepo) private var repo

Established, battle-tested container-based DI with dynamic registration — flexible and runtime-resolved. Because it resolves at runtime, graph errors surface as a crash at launch, not a build failure. Reach for it only when complex module composition (multiple assemblies, feature flags, dynamic module loading) is hard to express in Factory's compile-time model. Decision rule: start with Factory for its compile-time safety and modern SwiftUI integration; move to Swinject only when dynamic module composition outweighs the cost of runtime graph validation.

03

Networking

2 tools
URLSessionour default

The built-in HTTP stack with native async/await; for most apps you don't need more. Use uploadTask(fromFile:) for large uploads (see the out-of-bundle blueprint). Our default.

Higher-level networking (retries, interceptors, multipart); worth it when request plumbing gets complex.

04

Concurrency

2 tools

async/await, actors, and structured tasks — our default. Actors close the data-race gaps that background callbacks open.

Apple's reactive framework; still useful for streams and bindings.

05

Push notifications

1 tool

Apple Push Notification service (APNs) is the underlying transport; the first-party UserNotifications framework is our default — no extra SDKs. Handle payloads in a UNUserNotificationCenterDelegate and keep the receiver light (offload heavy work to a background task, never block the main thread). Support alert, background, and silent payload types, and register the device token against the user on your backend for targeting and analytics.

06

Local storage

2 tools
GRDBour default

A robust, well-documented SQLite toolkit with record types and powerful observation. Our default for structured local data — the fine-grained control over queries (joins, custom SQL) and predictable performance it gives are essential for complex data models.

Apple's SwiftUI-native persistence layer, built on Core Data — more abstracted and opinionated, ideal for simpler models with tight SwiftUI integration. A strong contender, though its maturity and performance on complex models are still evolving. Decision rule: GRDB for complex models and fine-grained control; SwiftData for simpler models where SwiftUI integration and Apple's latest API are the priority.

07

Security

2 tools
KeychainAccessour default

Ergonomic Keychain wrapper for tokens and secrets — write access and refresh tokens atomically. Our default for storing tokens and secrets.

CryptoKitour default

Apple's high-level, Swift-native cryptography framework — safe APIs for hashing (SHA-256/512), symmetric encryption (AES-GCM), public-key signatures and key agreement, and Secure Enclave integration. The Swift-native counterpart to Google's Tink: reach for it whenever you need to encrypt data, verify signatures, or handle sensitive information beyond what Keychain storage covers. Our default for application-level cryptographic operations.

08

UI & images

2 tools
SwiftUIour default

Declarative UI — our default for new screens. Mind @MainActor isolation.

Async image downloading and caching for SwiftUI/UIKit.

09

Testing

2 tools

First-party unit and UI testing; Swift Testing is the modern macro-based successor. Our default.

BDD-style specs and expressive matchers when the team prefers that flow.

10

Monitoring & observability

4 tools

Real-time crash reporting with symbolicated stack traces and impact grouping. Our default for crash monitoring.

Crashes, performance traces, and release health in one product — the pick when app and backend errors share a vendor.

Apple's on-device power, performance, and crash diagnostics, delivered daily — no third-party SDK.

Unified structured logging, and signposts for measuring performance intervals in Instruments.

11

CI/CD

4 tools
Fastlaneour default

Build, sign (match for certificates), and ship to TestFlight/App Store. Our default for release automation.

GitHub Actionsour default

CI on macOS runners for build/test/lint. Our default CI.

Apple's integrated CI/CD, wired into Xcode and TestFlight.

Beta distribution to internal and external testers.

12

Linting & formatting

3 tools
SwiftLintour default

The de-facto Swift linter — enforce style and catch issues in a build phase or CI. Our default.

SwiftFormatour default

Opinionated auto-formatter for Swift. Our default for formatting.

Apple's official formatter and linter for Swift.

Building on iOS?

We ship production iOSwith exactly this stack. Tell us what you're building.

Start a conversation