Skip to content

Tuist에 SceneDelegate 추가하기

Vardy edited this page Dec 10, 2023 · 1 revision

Tuist에 SceneDelegate 추가하기

Tuist로 프로젝트를 생성하게 되면, iOS13 이전 버전의 템플릿으로 만들어지게 됩니다. 그래서 SceneDelegate는 없고, AppDelegate가 UIWindow를 가지고 있어요.

왜 Tuist에서는 SceneDelegate가 포함된 템플릿을 만들어 주지 않는지 모르겠지만…ㅎㅎ 아무튼 iOS13 이후 버전에 맞게 세팅해보도록 하겠습니다.

비어있는 Info.plist 추가하기

Xcode로 만든 프로젝트와 Tuist로 생성한 프로젝트의 Info.plist파일을 비교해보겠습니다.

Untitled

xcode 15.0.1에서 만든 프로젝트의 info.plist

Untitled 1

tuist 3.31.2 버전에서 만든 tuist

차이가 보이시나요?

SceneDelegate를 설정해주기 위한 Scene Configuration이 설정되어있지 않습니다.

우리는 이걸 추가해주어야 해요. 그러기 위해선 info.plist의 key와 value값의 raw type으로 세팅해주어야 하는데요.

info.plist에서 아무 데나 우클릭해서 Raw Keys and Values 옵션을 키면 프로퍼티의 Raw값을 알 수 있습니다.

Untitled 2

그리고 우리는 저 트리 구조에 맞게 Tuist에 값을 설정해야해요.

Tuist Manifast 수정

tuist가 자동으로 만들어주는 템플릿을 그대로 따라가볼게요.

Project+Templates에 들어가게되면 makeAppTargets(name:platform:dependencies:)에서 info.plist를 설정하는 코드가 나와요.

여기서 SceneDelegate를 위한 프로퍼티를 세팅해볼게요.

Untitled 3

위에서 우리가 비교했던 SceneDelegate 관련 프로퍼티를 아래 사진으로 가져왔어요. 우리는 이걸 프로퍼티로 타입에 맞게 세팅해주면 됩니다.

Untitled 4

저는 아래처럼 작성했어요.

  • CFBundleShortVersionString은 Xcode로 만들었을 때 $(MARKETING_VERSION)으로 되어있어서 그대로 따르도록 적어줬어요.
  • CFBundleVersion은 기본값으로 알아서 1을 제공해주기 때문에 지웠어요.
  • 그 외 나머지는 저희가 넣어야하는 값을 프로퍼티 타입에 맞추어 넣어줬어요. UISceneStoryboardFile은 스토리보드를 쓰는 경우에만 넣어주면 되므로 code-base로 구현하고자 저는 넣지 않았습니다.
Untitled 5

SceneDelegate와 AppDelegate를 수정하자

이렇게 수정하고 나서 프로젝트를 생성하면 Info.plist가 정상적으로 추가된 걸 볼 수 있을 거에요.

Untitled 6

이제 AppDelegate의 window 관련 코드를 지우고, SceneDelegate Life Cycle을 세팅해주어야 합니다.

늘상 프로젝트를 생성하면 자동으로 만들어주는 AppDelegate의 코드를 그대로 작성하면 돼요.

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
  
  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil)
  -> Bool {
    true
  }
  
  // 이 부분은 Info.plist로 경로를 설정해주었기에 메서드를 지워도 무방합니다.
  func application(
    _ application: UIApplication,
    configurationForConnecting connectingSceneSession: UISceneSession,
    options: UIScene.ConnectionOptions)
  -> UISceneConfiguration {
    UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
  }
}

그리고 나서 SceneDelegate.swift를 생성해주고, 항상 SceneDelegate에서 Code-base로 작성했던 코드를 그대로 넣어주면 완성이에요.

import UIKit
// generated by tuist module
import AccessibilityTestProjectUI
import AccessibilityTestProjectKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  
  var window: UIWindow?
  
  func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
    guard let windowScene = scene as? UIWindowScene else { return }
    window = UIWindow(windowScene: windowScene)
    window?.rootViewController = ViewController()
    window?.makeKeyAndVisible()
    
    // generated by tuist module
    AccessibilityTestProjectKit.hello()
    AccessibilityTestProjectUI.hello()
  }
}

이렇게 하면 SceneDelegate를 사용하면서 tuist를 사용할 수 있습니다. ☺️

Clone this wiki locally