SwiftUI프로그래밍

[SwiftUI] macOS 맥북 menu bar 어플 최소화될때 어플 종료되는 문제 해결방법은?


맥북 메뉴바에서 앱 아이콘을 실행하면 어플이 최대화되고
최소화될때 앱이 종료됨
어떻게 해결해야할까?


앱 최소화 시 종료되는 문제 해결 방법

앱이 최소화될 때 자동으로 종료되는 이유는 macOS에서 메뉴바 전용 앱으로 잘못 인식하거나, 윈도우 관리를 잘못하고 있기 때문이래
이걸 방지하려면 몇 가지 설정을 변경해야 한다.

해결 방법 1: NSApplication.shared.windows 윈도우 설정 수정

macOS에서 앱이 최소화될 때 종료되지 않도록 하려면, 앱이 최소화될 때 종료되지 않도록 윈도우 설정을 변경해야 해.

수정 방법

AppDelegate.swift 또는 SceneDelegate.swift에서 applicationShouldTerminateAfterLastWindowClosed 값을 false로 설정.

import Cocoa

@main
class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
        return false // 마지막 윈도우가 닫혀도 앱이 종료되지 않도록 설정
    }
}

이렇게 하면 메뉴바 아이콘을 클릭해서 최소화되더라도 앱이 종료되지 않는다고 쳇지피티가 알려줬으나 실패다!!


해결 방법 2: Info.plist 설정 수정

Info.plist에서 앱이 백그라운드에서 실행될 수 있도록 설정해야 해.

수정 방법

  1. Info.plist에서 아래 키를 추가하거나 수정
<key>NSApplicationSupportsAutomaticTermination</key> <false/> <key>LSUIElement</key> <false/>

이렇게 설정하면, 앱이 최소화되더라도 자동 종료되지 않는다는데, 실패다!!


해결 방법 3: 윈도우가 사라지지 않도록 isVisible 속성 유지

앱이 최소화될 때 윈도우가 닫히는 것이 아니라 단순히 숨겨지도록 설정하는 방법이다.

AppDelegate.swift에서 아래 코드 추가

import Cocoa

@main
class AppDelegate: NSObject, NSApplicationDelegate {
    var window: NSWindow!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        if let mainWindow = NSApplication.shared.windows.first {
            self.window = mainWindow
            self.window.isReleasedWhenClosed = false  // 창이 닫혀도 앱이 종료되지 않도록 설정
        }
    }
}

이 설정을 추가하면:
윈도우가 최소화되더라도 앱이 종료되지 않음!
메뉴바 아이콘을 클릭하면 다시 복구됨!

3번째 방법은 어떻게 해야하는지 잘 모르겠다.

4. 앱이 최소화될 때 실제로 종료되는지 확인

터미널을 열고, 아래 명령어로 앱이 완전히 종료되는지 확인:

log stream --predicate 'eventMessage contains "process"' --info

이 명령어를 실행한 상태에서 앱을 실행하고 최소화한 다음, 어떤 로그가 출력되는지 확인해본다.
특히 terminated 관련 메시지가 있는지 확인

드디어 원인 찾았다.

macOS 앱이 창을 닫거나 최소화할 때 자동으로 종료되는 이유는 NSApplication.shared.terminate(self) 같은 코드가 어디선가 호출되거나, NSApplication.shared.windows 리스트에서 윈도우가 완전히 제거되기 때문이다.

그래서 내 프로젝트에서 NSApplication.shared.terminate(self)를 찾아보았다.

ContentView.swift 파일 내에서 아래 코드에서 호출하고 있는게 아닌가?

        .onDisappear {
            exitApp()
        }

맥OS 업그레이드 하기전에는 이 코드가 있어도 이런 문제가 발생되지 않았다.

5시간의 삽질끝에 오류해결이구나!!

고맙다 ChatGPT!!

error: Content is protected !!