Skip to content

Instantly share code, notes, and snippets.

@IanKeen
Last active August 17, 2023 03:33
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save IanKeen/66d3ab351a73befc394eb266ac5c8fe8 to your computer and use it in GitHub Desktop.
Save IanKeen/66d3ab351a73befc394eb266ac5c8fe8 to your computer and use it in GitHub Desktop.
Example main.swift
import Foundation
import SwiftUI
let isUITesting = /* your UI test detection here */
@main
struct EntryPoint {
static func main() {
if isUITesting {
UITestApp.main()
} else if NSClassFromString("XCTestCase") == nil {
MyApp.main()
} else {
TestApp.main()
}
}
}
struct MyApp: App {
var body: some Scene {
WindowGroup {
//.. app here
}
}
}
struct UITestApp: App {
var body: some Scene {
WindowGroup {
//.. prod app bootstrapped for UI tests
}
}
}
struct TestApp: App {
var body: some Scene {
WindowGroup { Text("Running tests...") }
}
}
NSSetUncaughtExceptionHandler { print("🧨", $0) }
let isUITesting = /* your UI test detection here */
let isUnitTesting = NSClassFromString("XCTest") != nil
let noTests = !isUnitTesting && !isUITesting
let delegate = isUITesting
? NSStringFromClass(UITestAppDelegate.self)
: noTests ? NSStringFromClass(AppDelegate.self)
: nil
print("🚀 Using AppDelegate:", delegate as AnyObject)
let argc = CommandLine.argc
let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(to: UnsafeMutablePointer<Int8>?.self, capacity: Int(CommandLine.argc))
UIApplicationMain(argc, argv, nil, delegate)
@IanKeen
Copy link
Author

IanKeen commented May 3, 2020

The last step is to remove @UIApplicationMain from your existing application delegate

@IanKeen
Copy link
Author

IanKeen commented Jul 25, 2022

The file needs to be called main.swift if you are using the UIApplicationMain approach. The EntryPoint approach can be anywhere as it will be found via the @main attribute.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment