Как приложение Mac может определить метод, используемый для его запуска?

У меня есть приложение для Mac OS X, которое также является обработчиком протоколов (как, например, Safari является обработчиком протоколов HTTP и HTTPS). Поэтому, когда пользователь щелкает ссылку вида myscheme://some-kind-of-info в любом приложении, мое приложение запускается для обработки ссылки.

Теперь мне нужно иметь возможность определить, было ли приложение запущено по такой ссылке, или оно было запущено любым другим способом. Другими словами, он запускался любым способом, кроме клика по ссылке. (В таких случаях я хочу, чтобы приложение оставалось открытым, но если оно было запущено по ссылке, оно должно закрыться и игнорировать ссылку. Таким образом, оно работает только тогда, когда оно уже запущено.)

Есть ли способ в приложении при запуске провести самоанализ и выяснить, что оно было запущено стандартным методом, а не событием AppleScript GetURL? Я хотел бы узнать это с помощью задокументированного метода, а не, например, просто открывать эти ссылки в моем приложении только после того, как оно будет запущено в течение полсекунды.


person Scott Lahteine    schedule 28.04.2011    source источник


Ответы (1)


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

  • Если приложение запускается без документов, вы получите kAEOpenApplication.
  • Если он запущен с документами, вы получите kAEOpenDocuments (или kAEPrintDocuments).
  • Если он запущен с URL-адресом, то (очевидно) вы получите kAEGetURL.

Также есть kAEOpenContents, но мне не удалось легко запустить его в тестовом приложении; это, вероятно, стоит поддерживать несмотря ни на что.

Как приложения Cocoa обрабатывают события Apple документы на все это.

Однако там есть одна ошибка; в нем говорится, что «запуск» AppleScript отправит kAEOpenApplication. Не будет, он отправит ascr/noop (kASAppleScriptSuite/kASLaunchEvent, определено в ASRegistry.h). Я не смог заставить обычный механизм обработчика событий Cocoa перехватывать это событие, поэтому вам, возможно, придется еще немного покопаться.

Один из способов проверить, отправляется ли событие при запуске, — это зарегистрировать обработчики событий в методе applicationWillFinishLaunching: вашего делегата приложения; они должны быть доставлены к моменту вызова applicationDidFinishLaunching:. С помощью этого метода вы могли бы потенциально только проверить наличие kAEGetURL.

person Nicholas Riley    schedule 28.04.2011
comment
Я нашел сокращенное решение для моего конкретного случая. Мое приложение реализует performDefaultImplementation в подклассе NSScriptCommand для получения и обработки URL-адреса. Этот селектор срабатывает после applicationWillFinishLaunching, но до applicationDidFinishLaunching... Итак, в моем случае я просто проверяю, сработал ли еще applicationDidFinishLaunching перед обработкой URL. - person Scott Lahteine; 29.04.2011
comment
Да, это в значительной степени то, что я предлагал в последнем предложении моего ответа. Рад, что ты разобрался. - person Nicholas Riley; 29.04.2011
comment
* Если бы я устанавливал обработчик событий внутри делегата приложения вместо использования NSScriptCommand, я полагаю, я мог бы установить обработчик событий в applicationDidFinishLaunching, чтобы получить тот же результат. - person Scott Lahteine; 29.04.2011
comment
Да, мне просто было проще не связываться с определениями терминологии для одноразового использования - я понимаю, что мне нужно было просто скопировать сообщение из списка рассылки 9,5-летней давности :-) omnigroup.com/mailman/archive/macosx-dev/2002-January/ - person Nicholas Riley; 29.04.2011