Упаковка двоичного кода C в пакет приложений Mac OS X
Я пытаюсь упаковать свой бинарный файл в минималистичный пакет приложений. Но я вижу странное поведение с результатом.
У моего пакета есть эта минимальная структура:
$ ls -R HelloWorld.app
Contents
HelloWorld.app/Contents:
Info.plist MacOS PkgInfo
HelloWorld.app/Contents/MacOS:
helloworld
helloworld - это двоичный файл C, скомпилированный из:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
while (1) {
printf("Hello world!\n");
sleep(2);
}
return 0;
}
Info.plist содержит:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>helloworld</string>
<key>CFBundleIdentifier</key>
<string>com.litl.helloworld</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>HelloWorld</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>20</string>
<key>LSMinimumSystemVersion</key>
<string>10.6</string>
<key>LSUIElement</key>
<true/>
<key>LSBackgroundOnly</key>
<true/>
</dict>
</plist>
Теперь о странном поведении. Когда я бегу
open ./HelloWorld.app
Команда висит около 30 секунд. После этого я могу подтвердить, что бинарный файл helloworld запущен. Однако его стандартный вывод не отображается в Console.app. Если я запускаю этот пакет программно (NSWorkspace sharedWorkspace] launchApplicationAtURL...), вызов завершается успешно, но двоичный файл завершается немедленно (я вижу в консоли, что он завершился с кодом ошибки 2).
Это на OS X 10.9.2.
Что я делаю неправильно?
1 ответ
Вам нужно зарегистрироваться в Cocoa, чтобы пометить ваше приложение как отзывчивое и "готовое". Если вы активируете значок дока, это означает, что он перестает подпрыгивать. В вашем случае, если вы прячете значок от док-станции, вам все равно нужно зарегистрироваться в Какао.
Вы можете сделать это, например, создав NSApplication
учебный класс. Смотрите здесь для некоторых низкоуровневых сделок.