当前位置:  开发笔记 > 前端 > 正文

使用Cocoa注册为登录项?

如何解决《使用Cocoa注册为登录项?》经验,为你挑选了3个好方法。

谷歌给了我:http://developer.apple.com/samplecode/LoginItemsAE/index.html

我认为必须有比使用AppleScript Events更好的方法.

所以我下载了Growl来源.他们使用Apple开发人员文章中的确切来源.

有没有更好的办法?

(我在系统偏好设置中指的是帐户中的登录项,即在用户以编程方式登录时启动我的程序)



1> Peter Hosey..:

在Leopard中有一个名为LSSharedFileList的新API.它允许您执行的操作之一是查看和编辑"登录项"列表(在该API中称为"会话登录项").

顺便说一下,我是Growl的首席开发人员.我们还没有切换到AE,因为我们仍然需要Tiger,但我正在考虑将其降低到1.2(尚未与其他开发人员讨论).当我们删除Tiger时,我们也将删除LoginItemsAE,并切换到共享文件列表API.


2012年的编辑:从2009年开始,当我最初写这个答案时,Growl已经切换到LSSharedFileList,我离开了项目.


我认为你的意思是LSSharedFileList

2> Reed Olsen..:

我偶然发现了Ben Clark-Robinson的LaunchAtLoginController.一个非常优雅的解决方案,非常常见的问题.


该代码不使用ARC并使用`LSSharedFileListItemResolve`,这在OS X 10.10中已弃用.我通过使用Xcode对ARC的建议并用`CFURLRef currentItemURL = LSSharedFileListItemCopyResolvedURL(item,resolutionFlags,NULL)`替换`LSSharedFileListItemResolve`来解决这些问题.它现在对我没有警告.
这非常好用且简单易用,谢谢.

3> poordevelope..:

这适用于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;
}


这非常感谢.从OSX 10.10开始,不推荐使用`LSSharedFileListItemResolve`.而是使用以下内容:`CFURLRef itemUrlRef = LSSharedFileListItemCopyResolvedURL(itemRef,0,&err);`
推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有