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?
Respuesta
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.
Lo siento, pero eso no parece explicarlo. – Joshua
Eso es muy viejo, estoy usando leopardo. ¿Todavía funciona? – Joshua
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
Ver también SO pregunta: Register as login item with cocoa
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);
}
}
¿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
O simplemente alternar usando una casilla de verificación, ¿cómo lo haría? – Joshua
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 –
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"];
}
¡Perfecto! ¡Gracias!+1 – keegan3d
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. –
Buen punto @ThomasTempelmann. ¿Pero por qué entradas * comienzan con * el nombre de la aplicación, en lugar de una coincidencia exacta? –
- 1. Iniciar sesión en la aplicación DropBox
- 2. ¿Cómo iniciar actividad solo una vez cuando la aplicación se abre por primera vez?
- 3. ¿Cómo iniciar mi aplicación mediante programación, si se abre otra aplicación?
- 4. Mac OS X: abra la aplicación al iniciar sesión, sin mostrar la ventana principal
- 5. Delphi: error de aplicación al iniciar sesión en el campo
- 6. Error al usar Twitter para iniciar sesión en la aplicación de mi iPhone
- 7. ¿Cómo impido que Magento combine la cesta al iniciar sesión?
- 8. Android: abre el navegador con la cookie de sesión suministrada
- 9. ¿Para iniciar sesión o no iniciar sesión?
- 10. No se puede modificar Iniciar sesión
- 11. Selenium: no se pudo iniciar la sesión de Selenium: no se pudo iniciar la nueva sesión del navegador: error al iniciar el navegador
- 12. Eclipse se atasca al intentar iniciar la aplicación Android
- 13. ¿Cómo controlas en qué monitor se abre la aplicación?
- 14. Cómo configurar cookies al iniciar/cerrar sesión con Devise
- 15. ¿Qué debo iniciar sesión en la aplicación de producción
- 16. ¿DataWithContentsOfURL está dañado al iniciar la aplicación?
- 17. Error al iniciar sesión en C#
- 18. Error interno al iniciar la aplicación
- 19. Cómo determinar, al iniciar, si la aplicación se bloqueó la última vez que se cerró?
- 20. WebView no puede iniciar sesión cuando la aplicación se inicia por primera vez
- 21. "BCrypt :: Errors :: InvalidHash" al intentar iniciar sesión
- 22. ¿Iniciar sesión en Sinatra?
- 23. Django iniciar sesión/cerrar sesión
- 24. Eclipse se bloquea en "iniciar actividad" al enviar la aplicación al dispositivo. ¿Cómo resolver esto?
- 25. Facebook: obligue al usuario a iniciar sesión/instale la aplicación con FBML
- 26. cómo iniciar sesión en la máquina ec2?
- 27. ¿Cómo ejecuta un script al iniciar sesión en * nix?
- 28. ¿Iniciar sesión con Facebook en la aplicación Spring MVC?
- 29. Iniciar sesión en la aplicación de subprocesos múltiples en java
- 30. IOS - no se pudo iniciar la aplicación
¿A qué sistema apunta? Es diferente dependiendo de si quieres 10.5, 10.4 o pre-10.4 –
Leopard 10.5 .... – Joshua