Отслеживайте, когда пользователь возвращается в приложение или перемещает фокус с окна Mac Catalyst

Я хотел бы использовать методы делегирования жизненного цикла UISceneSession, чтобы информировать мое приложение Mac Catalyst, когда пользователь перемещает фокус с приложения (окна), а затем возвращается в приложение (окно).

Когда приложение впервые запускается на Mac, sceneWillEnterForeground и sceneDidBecomeActive успешно вызываются, однако, когда я сосредотачиваюсь на другом приложении, методы делегирования, такие как sceneWillEnterForeground, не вызываются. Почему?


person Cesare    schedule 12.08.2020    source источник


Ответы (1)


Если вы отметите NSWindowDelegate.windowDidBecomeMain(_:), то заметите, что его параметр представляет собой уведомление, имя NSWindowDidBecomeMainNotification.

Итак, вы можете наблюдать за этим уведомлением, чтобы получать уведомления всякий раз, когда окно в вашем приложении становится сфокусированным:

NotificationCenter.default.addObserver(forName: .init("NSWindowDidBecomeMainNotification"), object: nil, queue: nil) { notification in
    print("This window became focused:", notification.object)
}

И вы также можете наблюдать NSWindowDidResignMainNotification, чтобы получать уведомления, когда окно в вашем приложении теряет фокус.

person Hejazi    schedule 15.08.2020
comment
Ответ работает, спасибо за это. Одно дело, .init(rawValue: "NSWindowDidBecomeMainNotification") работает вместо .init("NSWindowDidBecomeMainNotification"). - person badhanganesh; 18.03.2021
comment
Это работает для приложения Mac Catalyst с одной сценой! Однако в приложении с несколькими сценами (несколько одновременно открытых ViewControllers) уведомление срабатывает всякий раз, когда любое из открытых окон получает фокус. Я копался в надежде найти событие, специфичное для активации одной сцены. Методы делегата сцены не запускаются после события начального открытия и активации. - person BlueskyMed; 07.06.2021