2009-05-02 13 views
27

Solo 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.¿Cómo se abre la aplicación al iniciar sesión?

+0

¿A qué sistema apunta? Es diferente dependiendo de si quieres 10.5, 10.4 o pre-10.4 –

+0

Leopard 10.5 .... – Joshua

Respuesta

19

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 (Sample code at the Developer Connectiong).

Aquí está el sample code(muerto) para Leopard que mencioné en los comentarios. Encontrado a través del this blog post. El código que necesita para habilitar o deshabilitar el inicio al iniciar sesión se encuentra en Controller.m.

+0

Lo siento, pero eso no parece explicarlo. – Joshua

+0

Eso es muy viejo, estoy usando leopardo. ¿Todavía funciona? – Joshua

+2

Lo que debe usar es la API LaunchServices/LSSharedFileList.h. Consulte http://secondgear-public.googlecode.com/svn/trunk/SGLaunchAtLogin/ para obtener algún código de muestra. El código que necesita está en Controller.m – Naaff

13

Llame al método pegado a continuación con una dirección de fichero apuntando a su aplicación para agregarlo a los elementos de inicio de sesión del usuario actual.

Para volver a deshabilitarlo, necesitará 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); 
    } 
} 
+0

¿Con qué reemplazo esto ?: // Inserte el elemento en la parte inferior de la lista de Elementos de inicio de sesión. ? ¿Y cómo obtendría ese mismo loginListRef, lo convertiría en una matriz y lo repetiría hasta encontrar el artículo con la url que desea deshabilitar? – Joshua

+0

O simplemente alternar usando una casilla de verificación, ¿cómo lo haría? – Joshua

+0

Hola Joshua, hay mucho terreno por recorrer allí. El código que publiqué te ayudará a descubrir cómo agregar algo a los elementos de inicio de sesión. En realidad, conectarlo a una casilla de verificación debería ser trivial si ya te sientes un poco cómodo trabajando en un proyecto de Cocoa. Si no es así, recomiendo comenzar aquí: http://tinyurl.com/3z4r9b –

40

Aquí hay un código que utilizo, que está basado en la fuente de 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 para aplicar fácil, hacer una @property BOOL startAtLogin; en una de sus clases e implementar 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"]; 
} 
+0

¡Perfecto! ¡Gracias!+1 – keegan3d

+1

Este ejemplo, como el más similar en existencia, no trata el caso donde la aplicación fue eliminada y luego reinstalada en otro lugar después de haber sido agregada a los Elementos de inicio de sesión, porque luego agregará otra entrada sin eliminar el muerto. Para hacer esto bien, antes de agregar uno nuevo, primero debe mirar todas las entradas y eliminar cualquiera cuyos nombres comiencen con el nombre de la aplicación. –

+0

Buen punto @ThomasTempelmann. ¿Pero por qué entradas * comienzan con * el nombre de la aplicación, en lugar de una coincidencia exacta? –

Cuestiones relacionadas