Как прикрепить обработчик .onReceive (NotificationCenter) к объекту приложения iOS

#swiftui #nsnotificationcenter

#swiftui #nsnotificationcenter

Вопрос:

Я начинаю играть с SwiftUI. Я нашел код, который позволяет мне присоединять onReceive() обработчик к объекту представления, настроенный для ответа на NotificationCenter такие сообщения, как UIApplication.willEnterForegroundNotification .

Тем не менее, я хочу создать одинаковую сборку приложений на базе кода для iOS и Mac. Я добавил цель macOS в свой проект и получил contentView, работающий на обеих платформах. Я бы предпочел не добавлять кучу #if os(macOS) или #if os(iOS) условно скомпилированный код к моему ContentView .

Целевой шаблон iOS создает объект приложения SwiftUI:

 @main
struct SwiftUI_CounterButtonApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
 

Похоже, что у цели Mac нет такого объекта приложения.

Я хотел бы поместить свой код, который обрабатывает уведомления переднего плана на уровне приложения, а не на уровне contentView.

Можно ли добавить onReceive() обработчик к объекту iOS App ?

И каким будет эквивалент для цели Mac OS? Все, что я вижу в цели Mac OS, — это код Swift, который создает и устанавливает мой contentView. Я не вижу кода SwiftUI в целевой программе macOS.

Ответ №1:

Вы можете использовать один и тот же целевой объект как для iOS, так и для macOS. Просто проверьте macOS в разделе General -> Deployment Info .

Затем вы можете использовать один и тот же код для обеих платформ:

 @main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
                    print("active")
                }
        }
    }
}