From d8e5cb237081c739da28d71accbb3f39a3518985 Mon Sep 17 00:00:00 2001 From: Vegard Matthey Date: Fri, 4 Jul 2025 18:24:44 +0200 Subject: [PATCH] reduce entropy by removing unnecessary files --- .gitignore | 1 + ImageViewer.xcodeproj/project.pbxproj | 6 +- ImageViewer/AppDelegate.swift | 39 +++---------- .../AccentColor.colorset/Contents.json | 4 ++ .../AppIcon.appiconset/Contents.json | 1 + .../AppIcon.appiconset/icon.png | Bin 0 -> 25901 bytes .../Base.lproj/LaunchScreen.storyboard | 25 --------- ImageViewer/Base.lproj/Main.storyboard | 24 -------- ImageViewer/Info.plist | 22 +------- ImageViewer/SceneDelegate.swift | 52 ------------------ ImageViewer/ViewController.swift | 17 ++---- ImageViewerTests/ImageViewerTests.swift | 8 --- ImageViewerUITests/ImageViewerUITests.swift | 17 ------ .../ImageViewerUITestsLaunchTests.swift | 10 ---- run.sh | 20 +++++++ 15 files changed, 46 insertions(+), 200 deletions(-) create mode 100644 .gitignore create mode 100644 ImageViewer/Assets.xcassets/AppIcon.appiconset/icon.png delete mode 100644 ImageViewer/Base.lproj/LaunchScreen.storyboard delete mode 100644 ImageViewer/Base.lproj/Main.storyboard delete mode 100644 ImageViewer/SceneDelegate.swift create mode 100755 run.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build diff --git a/ImageViewer.xcodeproj/project.pbxproj b/ImageViewer.xcodeproj/project.pbxproj index 1dde677..32f2eef 100644 --- a/ImageViewer.xcodeproj/project.pbxproj +++ b/ImageViewer.xcodeproj/project.pbxproj @@ -289,13 +289,14 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = U5B4RH73LN; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ImageViewer/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -316,13 +317,14 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = U5B4RH73LN; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ImageViewer/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ImageViewer/AppDelegate.swift b/ImageViewer/AppDelegate.swift index 885a359..6b89bf6 100644 --- a/ImageViewer/AppDelegate.swift +++ b/ImageViewer/AppDelegate.swift @@ -1,36 +1,15 @@ -// -// AppDelegate.swift -// ImageViewer -// -// Created by Christine Bieker on 04/07/2025. -// - import UIKit -@main +@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - // MARK: UISceneSession Lifecycle - - func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { - // Called when a new scene session is being created. - // Use this method to select a configuration to create the new scene with. - return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) - } - - func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { - // Called when the user discards a scene session. - // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. - // Use this method to release any resources that were specific to the discarded scenes, as they will not return. - } - - + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + window?.rootViewController = ViewController() + window?.makeKeyAndVisible() + return true + } } - diff --git a/ImageViewer/Assets.xcassets/AccentColor.colorset/Contents.json b/ImageViewer/Assets.xcassets/AccentColor.colorset/Contents.json index eb87897..d2ddb70 100644 --- a/ImageViewer/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/ImageViewer/Assets.xcassets/AccentColor.colorset/Contents.json @@ -1,6 +1,10 @@ { "colors" : [ { + "color" : { + "platform" : "universal", + "reference" : "systemGrayColor" + }, "idiom" : "universal" } ], diff --git a/ImageViewer/Assets.xcassets/AppIcon.appiconset/Contents.json b/ImageViewer/Assets.xcassets/AppIcon.appiconset/Contents.json index 2305880..c68da6c 100644 --- a/ImageViewer/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ImageViewer/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "icon.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/ImageViewer/Assets.xcassets/AppIcon.appiconset/icon.png b/ImageViewer/Assets.xcassets/AppIcon.appiconset/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dc931193b492a0cd24fadf464b6e337aa5447ae3 GIT binary patch literal 25901 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 E02q}0-v9sr literal 0 HcmV?d00001 diff --git a/ImageViewer/Base.lproj/LaunchScreen.storyboard b/ImageViewer/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 865e932..0000000 --- a/ImageViewer/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ImageViewer/Base.lproj/Main.storyboard b/ImageViewer/Base.lproj/Main.storyboard deleted file mode 100644 index 25a7638..0000000 --- a/ImageViewer/Base.lproj/Main.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ImageViewer/Info.plist b/ImageViewer/Info.plist index dd3c9af..0c67376 100644 --- a/ImageViewer/Info.plist +++ b/ImageViewer/Info.plist @@ -1,25 +1,5 @@ - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main - - - - - + diff --git a/ImageViewer/SceneDelegate.swift b/ImageViewer/SceneDelegate.swift deleted file mode 100644 index cff02e3..0000000 --- a/ImageViewer/SceneDelegate.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// SceneDelegate.swift -// ImageViewer -// -// Created by Christine Bieker on 04/07/2025. -// - -import UIKit - -class SceneDelegate: UIResponder, UIWindowSceneDelegate { - - var window: UIWindow? - - - func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { - // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. - // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. - // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). - guard let _ = (scene as? UIWindowScene) else { return } - } - - func sceneDidDisconnect(_ scene: UIScene) { - // Called as the scene is being released by the system. - // This occurs shortly after the scene enters the background, or when its session is discarded. - // Release any resources associated with this scene that can be re-created the next time the scene connects. - // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). - } - - func sceneDidBecomeActive(_ scene: UIScene) { - // Called when the scene has moved from an inactive state to an active state. - // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. - } - - func sceneWillResignActive(_ scene: UIScene) { - // Called when the scene will move from an active state to an inactive state. - // This may occur due to temporary interruptions (ex. an incoming phone call). - } - - func sceneWillEnterForeground(_ scene: UIScene) { - // Called as the scene transitions from the background to the foreground. - // Use this method to undo the changes made on entering the background. - } - - func sceneDidEnterBackground(_ scene: UIScene) { - // Called as the scene transitions from the foreground to the background. - // Use this method to save data, release shared resources, and store enough scene-specific state information - // to restore the scene back to its current state. - } - - -} - diff --git a/ImageViewer/ViewController.swift b/ImageViewer/ViewController.swift index 313b25c..454f714 100644 --- a/ImageViewer/ViewController.swift +++ b/ImageViewer/ViewController.swift @@ -1,19 +1,14 @@ -// -// ViewController.swift -// ImageViewer -// -// Created by Christine Bieker on 04/07/2025. -// - import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. + view.backgroundColor = .white + let label = UILabel() + label.text = "Hello, UIKit!" + label.textAlignment = .center + label.frame = CGRect(x: 50, y: 150, width: 300, height: 50) + view.addSubview(label) } - - } - diff --git a/ImageViewerTests/ImageViewerTests.swift b/ImageViewerTests/ImageViewerTests.swift index c6a7516..9a731bb 100644 --- a/ImageViewerTests/ImageViewerTests.swift +++ b/ImageViewerTests/ImageViewerTests.swift @@ -1,17 +1,9 @@ -// -// ImageViewerTests.swift -// ImageViewerTests -// -// Created by Christine Bieker on 04/07/2025. -// - import Testing @testable import ImageViewer struct ImageViewerTests { @Test func example() async throws { - // Write your test here and use APIs like `#expect(...)` to check expected conditions. } } diff --git a/ImageViewerUITests/ImageViewerUITests.swift b/ImageViewerUITests/ImageViewerUITests.swift index ba5a6d8..e8b171b 100644 --- a/ImageViewerUITests/ImageViewerUITests.swift +++ b/ImageViewerUITests/ImageViewerUITests.swift @@ -1,39 +1,22 @@ -// -// ImageViewerUITests.swift -// ImageViewerUITests -// -// Created by Christine Bieker on 04/07/2025. -// - import XCTest final class ImageViewerUITests: XCTestCase { override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. continueAfterFailure = false - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. } override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. } @MainActor func testExample() throws { - // UI tests must launch the application that they test. let app = XCUIApplication() app.launch() - - // Use XCTAssert and related functions to verify your tests produce the correct results. } @MainActor func testLaunchPerformance() throws { - // This measures how long it takes to launch your application. measure(metrics: [XCTApplicationLaunchMetric()]) { XCUIApplication().launch() } diff --git a/ImageViewerUITests/ImageViewerUITestsLaunchTests.swift b/ImageViewerUITests/ImageViewerUITestsLaunchTests.swift index f99ecf7..1d5d363 100644 --- a/ImageViewerUITests/ImageViewerUITestsLaunchTests.swift +++ b/ImageViewerUITests/ImageViewerUITestsLaunchTests.swift @@ -1,10 +1,3 @@ -// -// ImageViewerUITestsLaunchTests.swift -// ImageViewerUITests -// -// Created by Christine Bieker on 04/07/2025. -// - import XCTest final class ImageViewerUITestsLaunchTests: XCTestCase { @@ -22,9 +15,6 @@ final class ImageViewerUITestsLaunchTests: XCTestCase { let app = XCUIApplication() app.launch() - // Insert steps here to perform after app launch but before taking a screenshot, - // such as logging into a test account or navigating somewhere in the app - let attachment = XCTAttachment(screenshot: app.screenshot()) attachment.name = "Launch Screen" attachment.lifetime = .keepAlways diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..9a1841a --- /dev/null +++ b/run.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +APP_NAME='ImageViewer' +SIM_DEVICE='iPad Air 11-inch (M3)' +SCHEME='ImageViewer' +DERIVED_DATA="./build" +SIMULATOR='iOS Simulator' +COMPANY='ImageViewer' + +# Boot and launch simulator +xcrun simctl boot "$SIM_DEVICE" +open -a Simulator + +# Build app +xcodebuild -scheme "$SCHEME" -derivedDataPath "$DERIVED_DATA" -destination "platform=$SIMULATOR,name=$SIM_DEVICE" + +# Install and launch +APP_PATH="$DERIVED_DATA/Build/Products/Debug-iphonesimulator/$APP_NAME.app" +xcrun simctl install booted "$APP_PATH" +xcrun simctl launch booted "$COMPANY.$APP_NAME"