cocoa - tarde - ¿Cómo se abre la aplicación al iniciar sesión?
tinder error 84503 (4)
Esta pregunta ya tiene una respuesta aquí:
Me pregunto cómo puedo hacer que mi aplicación se abra automáticamente al iniciar sesión, pero puedo activar y desactivar esta opción usando una casilla de verificación en la ventana de preferencias.
Aquí hay un código que uso, está basado en la fuente 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);
}
}
Si desea una casilla de verificación fácil de implementar, @property BOOL startAtLogin;
un @property BOOL startAtLogin;
en una de tus clases e implementarlo de la siguiente manera. Simplemente enlace el valor de la casilla de verificación a la propiedad y todo debería funcionar a la perfección.
- (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"];
}
Hay una descripción decente de qué hacer en CocoaDev .
Básicamente, querrá usar la API en LaunchServices / LSSharedFileList.h si puede apuntar a Mac OS X 10.5 o posterior. Antes de 10.5 no había una API limpia, por lo que debe manipular manualmente los elementos de inicio de sesión ( código de muestra en Developer Connectiong ).
Aquí está el código de muestra (muerto) para Leopard que mencioné en los comentarios. Encontrado a través de esta publicación de blog . El código que necesita para habilitar o deshabilitar el inicio al iniciar sesión se encuentra en Controller.m.
Llame al método pegado a continuación con un URL de archivo apuntando a su aplicación para agregarlo a los elementos de inicio de sesión del usuario actual.
Para volver a deshabilitarlo, deberá obtener ese mismo loginListRef, convertirlo en una matriz e iterar hasta encontrar el elemento con la url que desea deshabilitar. Finalmente, llame a LSSharedFileListItemRemove con los argumentos apropiados.
Buena suerte :)
- (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);
}
}
Véase también la pregunta SO: Registrarse como elemento de inicio de sesión con cacao