Просто интересно, как я могу открыть приложение автоматически при входе в систему, но сделайте так, чтобы он можно было включать и выключать с помощью флажка в окне настроек.
Как сделать свое приложение открытым при входе в систему?
Ответ 1
Существует достойное описание того, что делать в CocoaDev.
В принципе, вы захотите использовать API в LaunchServices/LSSharedFileList.h, если вы можете настроить таргетинг на Mac OS X 10.5 или новее. До 10.5 не было никакого чистого API, поэтому вам нужно вручную манипулировать элементами входа (Пример кода в Developer Connectiong).
Здесь пример кода (dead) для Leopard я в комментариях. Найдено через это сообщение в блоге. Код, необходимый для включения или отключения запуска при входе в систему, находится в Controller.m.
Ответ 2
Вот какой код, который я использую, он основан на источнике Growl.
+ (BOOL) willStartAtLogin:(NSURL *)itemURL
{
Boolean foundIt=false;
LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
if (loginItems) {
UInt32 seed = 0U;
NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
for (id itemObject in currentLoginItems) {
LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;
UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
CFURLRef URL = NULL;
OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
if (err == noErr) {
foundIt = CFEqual(URL, itemURL);
CFRelease(URL);
if (foundIt)
break;
}
}
CFRelease(loginItems);
}
return (BOOL)foundIt;
}
+ (void) setStartAtLogin:(NSURL *)itemURL enabled:(BOOL)enabled
{
OSStatus status;
LSSharedFileListItemRef existingItem = NULL;
LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
if (loginItems) {
UInt32 seed = 0U;
NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
for (id itemObject in currentLoginItems) {
LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;
UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
CFURLRef URL = NULL;
OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
if (err == noErr) {
Boolean foundIt = CFEqual(URL, itemURL);
CFRelease(URL);
if (foundIt) {
existingItem = item;
break;
}
}
}
if (enabled && (existingItem == NULL)) {
LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst,
NULL, NULL, (CFURLRef)itemURL, NULL, NULL);
} else if (!enabled && (existingItem != NULL))
LSSharedFileListItemRemove(loginItems, existingItem);
CFRelease(loginItems);
}
}
Если вы хотите легко установить флажок, сделайте @property BOOL startAtLogin;
в одном из ваших классов и реализуйте его следующим образом. Просто привяжите значение флажка к свойству, и оно должно работать без проблем.
- (NSURL *)appURL
{
return [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
}
- (BOOL)startAtLogin
{
return [LoginItem willStartAtLogin:[self appURL]];
}
- (void)setStartAtLogin:(BOOL)enabled
{
[self willChangeValueForKey:@"startAtLogin"];
[LoginItem setStartAtLogin:[self appURL] enabled:enabled];
[self didChangeValueForKey:@"startAtLogin"];
}
Ответ 3
Вызовите метод, вставленный ниже, с URL-адресом файла, указывающим на ваше приложение, чтобы добавить его в текущие элементы входа пользователя.
Чтобы снова отключиться, вам нужно получить тот же loginListRef, преобразовать его в массив и прокрутить его до тех пор, пока не найдете элемент с URL-адресом, который вы хотите отключить. Наконец, вызовите LSSharedFileListItemRemove с соответствующими аргументами.
Удачи:)
- (void)enableLoginItemWithURL:(NSURL *)itemURL
{
LSSharedFileListRef loginListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
if (loginListRef) {
// Insert the item at the bottom of Login Items list.
LSSharedFileListItemRef loginItemRef = LSSharedFileListInsertItemURL(loginListRef,
kLSSharedFileListItemLast,
NULL,
NULL,
(CFURLRef)itemURL,
NULL,
NULL);
if (loginItemRef) {
CFRelease(loginItemRef);
}
CFRelease(loginListRef);
}
}
Ответ 4
См. также вопрос SO: Зарегистрируйтесь как элемент входа с cocoa