Если вы хотите запускать обычное приложение при входе в систему, я бы порекомендовал использовать API списка общих файлов LaunchServices, а не launchd. Вместо того, чтобы устанавливать список запуска, вы можете просто использовать этот API, чтобы добавить свое приложение к элементам входа пользователя (те, которые вы видите на преф-панели «Учетные записи» в Системных настройках). Преимущества этого: а) для пользователя более очевидно, почему приложение запускается при входе в систему, б) пользователю легче удалить его, и в) если пользователь удаляет ваше приложение, launchd будет жаловаться на ошибки консоли. когда не удается запустить (теперь отсутствует) приложение.
Похоже, что нет никакой справочной документации по API, но соответствующие функции находятся в LSSharedFileList.h. Код для этого будет выглядеть примерно так:
#import <CoreServices/CoreServices.h>
...
LSSharedFileListRef loginItemList = LSSharedFileListCreate(kCFAllocatorDefault, kLSSharedFileListSessionLoginItems, NULL);
if (loginItemList != NULL)
{
LSSharedFileListRef myItem = LSSharedFileListInsertItemURL(loginItemList, kLSSharedFileListItemLast, NULL, NULL, (CFURLRef)[[NSBundle mainBundle] bundleURL], NULL, NULL);
//We don't do anything with the new item, but we need to release it so it doesn't leak
if (myItem != NULL)
CFRelease(myItem);
CFRelease(loginItemList);
}
Если вы хотите, чтобы этот элемент запускался для всех пользователей, а не только для текущего пользователя, вошедшего в систему, вы можете использовать kLSSharedFileListGlobalLoginItems вместо kLSSharedFileListSessionLoginItems.