谷歌给了我:http://developer.apple.com/samplecode/LoginItemsAE/index.html
我认为必须有比使用AppleScript Events更好的方法.
所以我下载了Growl来源.他们使用Apple开发人员文章中的确切来源.
有没有更好的办法?
(我在系统偏好设置中指的是帐户中的登录项,即在用户以编程方式登录时启动我的程序)
在Leopard中有一个名为LSSharedFileList的新API.它允许您执行的操作之一是查看和编辑"登录项"列表(在该API中称为"会话登录项").
顺便说一下,我是Growl的首席开发人员.我们还没有切换到AE,因为我们仍然需要Tiger,但我正在考虑将其降低到1.2(尚未与其他开发人员讨论).当我们删除Tiger时,我们也将删除LoginItemsAE,并切换到共享文件列表API.
2012年的编辑:从2009年开始,当我最初写这个答案时,Growl已经切换到LSSharedFileList,我离开了项目.
我偶然发现了Ben Clark-Robinson的LaunchAtLoginController.一个非常优雅的解决方案,非常常见的问题.
这适用于xcode 5.
- (BOOL)isLaunchAtStartup { // See if the app is currently in LoginItems. LSSharedFileListItemRef itemRef = [self itemRefInLoginItems]; // Store away that boolean. BOOL isInList = itemRef != nil; // Release the reference if it exists. if (itemRef != nil) CFRelease(itemRef); return isInList; } - (void)toggleLaunchAtStartup { // Toggle the state. BOOL shouldBeToggled = ![self isLaunchAtStartup]; // Get the LoginItems list. LSSharedFileListRef loginItemsRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); if (loginItemsRef == nil) return; if (shouldBeToggled) { // Add the app to the LoginItems list. CFURLRef appUrl = (__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; LSSharedFileListItemRef itemRef = LSSharedFileListInsertItemURL(loginItemsRef, kLSSharedFileListItemLast, NULL, NULL, appUrl, NULL, NULL); if (itemRef) CFRelease(itemRef); } else { // Remove the app from the LoginItems list. LSSharedFileListItemRef itemRef = [self itemRefInLoginItems]; LSSharedFileListItemRemove(loginItemsRef,itemRef); if (itemRef != nil) CFRelease(itemRef); } CFRelease(loginItemsRef); } - (LSSharedFileListItemRef)itemRefInLoginItems { LSSharedFileListItemRef res = nil; // Get the app's URL. NSURL *bundleURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; // Get the LoginItems list. LSSharedFileListRef loginItemsRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); if (loginItemsRef == nil) return nil; // Iterate over the LoginItems. NSArray *loginItems = (__bridge NSArray *)LSSharedFileListCopySnapshot(loginItemsRef, nil); for (id item in loginItems) { LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)(item); CFURLRef itemURLRef; if (LSSharedFileListItemResolve(itemRef, 0, &itemURLRef, NULL) == noErr) { // Again, use toll-free bridging. NSURL *itemURL = (__bridge NSURL *)itemURLRef; if ([itemURL isEqual:bundleURL]) { res = itemRef; break; } } } // Retain the LoginItem reference. if (res != nil) CFRetain(res); CFRelease(loginItemsRef); CFRelease((__bridge CFTypeRef)(loginItems)); return res; }