¿Cómo evitar que una aplicación se inicie al iniciar sesión?

Creé una aplicación, que se configura para iniciarse al iniciar sesión usando SMLoginItemSetEnabled. Aquí está el código que utiliza. Mi pregunta es, ¿cómo puedo eliminar manualmente esta aplicación para que no se inicie al iniciar sesión ?

La aplicación no se muestra en "Elementos de inicio de sesión", /Library/LaunchAgentsni /Library/LaunchDaemonsen las carpetas /Users/username/Library/LaunchAgentso . /Users/username/Library/LaunchDaemonsMiré alrededor en /Library/Preferencesy PreferecePanes, pero no encontré nada. La aplicación se carga al iniciar sesión.

si elimina la aplicación (del disco), ¿qué dice la consola?
Si elimino la aplicación (incluso cuando no se está ejecutando), puedo moverla a la Papelera, pero cuando intento vaciar la Papelera, no se elimina la aplicación.
¿Alguna vez encontraste una solución para esto? Preguntándose lo mismo.
Parece que algunos se enumeran aquí: /var/db/com.apple.xpc.launchd/disabled.$UID.plist

Respuestas (5)

Puede detener el lanzamiento del elemento con .launchctl disable gui/$UID/bundle-id

Si no conoce el ID del paquete, puede encontrarlo escribiendo launchctl list. Eso enumerará todos los procesos que se ejecutan bajo su usuario, con sus PID en la primera columna. Entonces, si viste esto:

$ launchctl list
-   0   com.apple.SafariHistoryServiceAgent
277 0   com.apple.Finder
-   0   com.apple.quicklook
-   0   com.apple.parentalcontrols.check
[…]
189 0   com.example.ExampleDaemon
-   0   com.apple.java.InstallOnDemand

… podría usar el Monitor de actividad para confirmar que el PID de la aplicación no deseada es 189, lo que hace que su ID de paquete sea com.example.ExampleDaemon. Entonces:

launchctl disable gui/$UID/com.example.ExampleDaemon

Eso es todo. Todavía hay un registro del elemento de inicio de sesión en el disco, simplemente deshabilitado. Si desea purgarlo, o simplemente desea obtener más información, siga leyendo.


Contrariamente a la intuición (¿pero divertidamente?), la lista se guarda aquí:

/var/db/com.apple.xpc.launchd/disabled.$UID.plist

Ese archivo se verá así:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.example.ExampleDaemon</key>
    <false/>
</dict>
</plist>

Sí, significa que se debefalse iniciar una aplicación con esa identificación de paquete al inicio. Después de ejecutar , cambiará a . (Por lo que puedo decir, launchd no escribe estos archivos de inmediato, por lo que es posible que no vea esto hasta que reinicie). Puede ver los elementos deshabilitados con este comando:launchctl disablefalsetrue

launchctl print-disabled gui/$UID

También hay información adicional sobre cada elemento de inicio de sesión almacenado aquí, pero eliminarlo no detendrá el inicio del elemento:

/var/db/com.apple.xpc.launchd/loginitems.$UID.plist

Cualquier cambio que realice mientras el sistema está funcionando se sobrescribirá cuando apague o reinicie. Entonces, por lo que puedo decir, la única forma de eliminar completamente un elemento disabled.$UID.plistes reiniciar en modo de usuario único y realizar las ediciones allí. Incluso sin haber ejecutado launchctl disable, la eliminación de un key/ falsepar de este archivo impide que la aplicación se inicie al iniciar sesión. No voy a incluir instrucciones para editar estos archivos en modo de usuario único en esta respuesta.

Debería poder detener y eliminar el ayudante desde launchdla línea de comandos. Abra Terminal.app y haga

launchctl list | grep -i com.your.helper

Mire una vez que haya ubicado job_label en la tercera columna, puede ejecutar

sudo launchctl stop com.your.helper
sudo launchctl remove com.your.helper

El manual para launchctlse puede encontrar aquí

Y si lo agregó con un ayudante, como dijo, entonces debería poder verlo en el plist (creo).

Mira esto:

-(BOOL)appIsPresentInLoginItems
{
    NSString *bundleID = @"com.madebynotion.myLoginHelper";
    NSArray * jobDicts = nil;
    jobDicts = (NSArray *)SMCopyAllJobDictionaries( kSMDomainUserLaunchd );
    // Note: Sandbox issue when using SMJobCopyDictionary()

    if ( (jobDicts != nil) && [jobDicts count] > 0 ) {

        BOOL bOnDemand = NO;

        for ( NSDictionary * job in jobDicts ) {

            if ( [bundleID isEqualToString:[job objectForKey:@"Label"]] ) {
                bOnDemand = [[job objectForKey:@"OnDemand"] boolValue];
                break;
            } 
        }

        CFRelease((CFDictionaryRef)jobDicts); jobDicts = nil;
        return bOnDemand;

    } 
    return NO;
}

fuente: http://blog.mcohen.me/2012/01/12/login-items-in-the-sandbox/

Gracias por la respuesta Martín. Pero estoy buscando una forma de eliminarlo manualmente (sin el uso del programa). ¿Dónde se almacena este archivo PList en el sistema?
Oh no hay problema. La razón por la que estaba agregando el código es para ver qué está haciendo. Tiene que estar en el directorio sanboxed de su aplicación tal vez... pero nunca pensé en eso. Voy a echar un vistazo aunque

Los elementos de inicio de sesión se almacenan en ~/Library/Preferences/com.apple.loginitems.plist, y se pueden administrar manualmente en Preferencias del sistema -> Usuarios y grupos -> su cuenta de usuario en la barra lateral -> pestaña Elementos de inicio de sesión.

Ese es el problema. La aplicación no se muestra en la pestaña Elementos de inicio de sesión, ¡y tampoco aparece en la lista ~/Library/Preferences/com.apple.loginitems.plist!

Si elimino la aplicación (incluso cuando no se está ejecutando), puedo moverla a la Papelera, pero cuando intento vaciar la Papelera, no se elimina la aplicación.

Cuando esté en la papelera, reinicie la mac en modo de usuario único (comience mientras mantiene presionado cmd+ s): esto se abrirá en una ventana de Terminal, ejecute

sudo rm -Rf ~/.Trash/*

y presione enter, luego reinicie normalmente.