Подтвердить что ты не робот

Как узнать, было ли приложение Mac Cocoa запущено нормально или как элемент входа?

Есть ли способ сказать, было ли приложение Cocoa запущено как элемент журнала, а не двойным щелчком по нему?

4b9b3361

Ответ 1

Когда приложение запускается без открытия или печати документа, оно получает событие Apple 'oapp' (a.k.a. kAEOpenApplication). Это событие может иметь параметр данных свойств (keyAEPropData). Для обычного запуска этот параметр отсутствует или 0. Для запуска из элемента входа он keyAELaunchedAsLogInItem. (Когда ваше приложение запущено для предоставления услуги, оно keyAELaunchedAsServiceItem.)

https://developer.apple.com/legacy/library/documentation/Carbon/Reference/Apple_Event_Manager/index.html#//apple_ref/doc/constant_group/Launch_Apple_Event_Constants

Вы можете проверить это с помощью следующего кода в методе -applicationWill/DidFinishLaunching::

NSAppleEventDescriptor* event = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
if ([event eventID] == kAEOpenApplication &&
    [[event paramDescriptorForKeyword:keyAEPropData] enumCodeValue] == keyAELaunchedAsLogInItem)
{
    // you were launched as a login item
}

Swift 3:

let event = NSAppleEventManager.shared().currentAppleEvent
let launchedAsLogInItem =
    event?.eventID == kAEOpenApplication &&
    event?.paramDescriptor(forKeyword: keyAEPropData)?.enumCodeValue == keyAELaunchedAsLogInItem

Ответ 2

Насколько я знаю, нет правильного способа проверить это, но есть некоторые мысли:

Лучшее решение:

Создайте два разных приложения, например TheApp и TheAppLauncher.
Добавьте TheApp в папку приложений и TheAppLaucher к элементам запуска.
Просто запустите TheApp с определенным флагом при запуске TheAppLauncher.
Надеюсь, это ясно:)

Другой вариант "уродливый":

Проверьте, действительно ли приложение указано в элементах входа:
https://github.com/carpeaqua/Shared-File-List-Example/

Сделайте журнал приложений точным временем его запуска.
Затем сравните его с последним моментом входа пользователя в систему.
Команда finger предоставляет эту информацию (используйте NSTask).
Хорошее изменение было начато как элемент входа в систему, когда разница небольшая.
Но да, это не совсем надежно:)

Ответ 3

В проекте Chromium приведен код для этого. Выполняется описанный здесь подход, проверяя родительский процесс и список элементов входа.

Ответ 4

Возможно, вы могли бы запустить приложение с опцией, если он был запущен как элемент входа. Например, назовите его MyApp.app --startupItem при использовании в качестве элемента запуска и вызовите его без этой опции, когда он запускается регулярно.

Параметры командной строки могут быть проверены классическим способом C, поскольку они передаются функции main в качестве аргументов.

Ответ 5

Настройте элемент входа, чтобы "Скрыть" был отмечен, а затем, когда ваше приложение запущено (awakeFromNib или init), проверьте, скрыто ли приложение или нет.

Ответ 6

В зависимости от того, что вы делаете, здесь может быть полезно NSApplicationLaunchIsDefaultLaunchKey. Это ключ, включенный в NSNotification, отправленный в applicationDidFinishLaunching:. Из документация:

Значение для этого ключа - это NSNumber, содержащий логическое значение. Значение NO, если приложение было запущено, чтобы открыть или распечатать файл, выполнить действие "Сервис", если в приложении было сохранено состояние, которое будет восстановлено, или если запуск приложения был в каком-то другом смысле, а не запуском по умолчанию. В противном случае его значение будет YES.

В дополнение к указанным случаям также устанавливается значение NO, если приложение автоматически запускается при входе в систему. Так что, если вы решаете, показывать ли какой-либо элемент интерфейса, например, это может быть достаточно информации, чтобы сделать то, что вам нужно.

Проверка [[NSApplication sharedApplication] isHidden] также может быть полезна, если вы хотите узнать, было ли приложение запущено с флажком "Скрыть".

Изменить: При дальнейшем тестировании я не уверен, что это действительно так. Когда приложение открыто нормально, NSApplicationLaunchIsDefaultLaunchKey обычно YES. Когда он запускается автоматически, он обычно выглядит как NO в ходе тестирования, которое я сделал до сих пор. Но ни одна из них не всегда верна, поэтому кажется, что этот ключ не может быть полезен в конце концов.