SMJobBless и друзья

Я сделал приложение, которое было отправлено в Mac AppStore. По некоторым причинам они отказались от этого, потому что он устанавливал вспомогательный инструмент, используя SMJobBless API.

Поскольку этот вспомогательный инструмент не требуется для большинства функций приложения, я удалил его, и мое приложение было принято.

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

Однако после того, как я установил файлы на месте, вспомогательный инструмент отказывается запускаться... Вспомогательный инструмент просто имеет plist, который входит в /Library/LaunchDaemons, и двоичный файл, который входит в /Library/PrivilegedHelperTools.

Теперь мне интересно, что именно SMJobBless делает больше, чем просто перемещает файлы? Это регистрация моего инструмента с launchctl? Я пробовал разные вещи, чтобы вручную добавить его в launchctl, но безуспешно: вспомогательный инструмент просто выходит из системы после запроса на регистрацию запроса.

Вспомогательный инструмент просто содержит следующее:

@autoreleasepool {
    launch_data_t       req             = launch_data_new_string(LAUNCH_KEY_CHECKIN);
    launch_data_t       resp            = launch_msg(req); // AT THIS POINT, RESP IS NULL. Why?
    launch_data_t       machData        = launch_data_dict_lookup(resp, LAUNCH_JOBKEY_MACHSERVICES);
    launch_data_t       machPData       = launch_data_dict_lookup(machData, [kHelperBundleName UTF8String]);
    mach_port_t         mp              = launch_data_get_machport(machPData);
    launch_data_free                    (resp);
    launch_data_free                    (req);
    // Prepare connexion.
    NSMachPort          *rp             = [[NSMachPort alloc] initWithMachPort:mp];
    PrivilegedHelperProxy
                        *phProxy        = [[[PrivilegedHelperProxy alloc] init] autorelease];
    NSConnection        *con            = [NSConnection connectionWithReceivePort:rp sendPort:nil];
    [rp release];
    [con setRootObject:phProxy];
    [[NSRunLoop currentRunLoop] run];
}
return                                  EXIT_SUCCESS;

Эта служба работала безупречно при установке через API SMJobBless, а корневой прокси был доступен из моего приложения...

Итак, каковы были бы необходимые шаги для моего установщика, чтобы этот вспомогательный инструмент работал должным образом, как это было бы при обращении к SMJobBless API?

Спасибо, Пьер.

1 ответ

Решение

Решаемые. Запись PList для вспомогательного инструмента не включала какие-либо ProgramArguments (похоже, это не проблема с SMJobBless API). После добавления их в PList вспомогательный инструмент может работать правильно, и установщик правильно его регистрирует.

В любом случае спасибо! Пьер.

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