Упаковка двоичного кода 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 учебный класс. Смотрите здесь для некоторых низкоуровневых сделок.

Другие вопросы по тегам