Como você faz seu aplicativo abrir no login? [duplicado
Pergunta
Esta pergunta já tem uma resposta aqui:
- Registre -se como item de login com cacau? 7 respostas
Apenas me perguntando como posso abrir meu aplicativo automaticamente no login, mas faça com que isso possa ser ativado e desativado usando uma caixa de seleção na janela Preferências.
Solução
Há uma descrição decente do que fazer em Cocoadev.
Basicamente, você deseja usar a API no LaunchServices/lSharedFileLelist.h se puder segmentar o Mac OS X 10.5 ou posterior. Antes de 10.5, não havia API limpa, então você precisa manipular manualmente os itens de login (Código de exemplo no desenvolvedor ConnectionG).
Aqui está o Código de amostra(morto) Para Leopard, mencionei nos comentários. Encontrado via esta postagem do blog. O código que você precisa para ativar ou desativar a inicialização no login está no controller.m.
Outras dicas
Aqui está algum código que eu uso, ele é baseado na fonte do 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);
}
}
Se você deseja uma caixa de seleção fácil de implementar, faça um @property BOOL startAtLogin;
em uma de suas aulas e implemente -a da seguinte forma. Basta vincular o valor da caixa de seleção à propriedade e tudo deve funcionar perfeitamente.
- (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"];
}
Ligue para o método colado abaixo com um URL de arquivo apontando para o seu aplicativo para adicioná -lo aos itens de login do usuário atual.
Para desativar novamente, você precisará obter o mesmo loginlistref, convertê -lo em uma matriz e iterar até encontrar o item com o URL que deseja desativar. Por fim, ligue para o LSSHAREDFILELISTITEMEMOVE com os argumentos apropriados.
Boa sorte :)
- (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);
}
}
Veja também a pergunta: Registre -se como item de login com cacau