当前位置:  开发笔记 > 编程语言 > 正文

如何在登录时打开您的应用程序?

如何解决《如何在登录时打开您的应用程序?》经验,为你挑选了3个好方法。

只是想知道如何在登录时自动打开我的应用程序,但是可以使用首选项窗口中的复选框打开和关闭它.



1> Nick Moore..:

这是我使用的一些代码,它基于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);
    }       
}

如果您想要一个易于实现的复选框,请@property BOOL startAtLogin;在其中一个类中创建并按如下方式实现它.只需将复选框值绑定到属性,它就可以无缝地工作.

- (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"];
}



2> Naaff..:

在CocoaDev上有一个很好的描述.

基本上,如果您可以定位Mac OS X 10.5或更高版本,则需要在LaunchServices/LSSharedFileList.h中使用API​​.在10.5之前没有干净的API,因此您必须手动操作登录项(Developer Connectiong中的示例代码).

这是我在评论中提到的Leopard 的示例代码(死).通过这篇博文发现.在登录时启用或禁用启动所需的代码位于Controller.m中.


示例代码是404.
您不能再在Mac App Store中使用沙盒应用程序的`LSSharedFileList.h`方法:http://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html
你应该使用的是LaunchServices/LSSharedFileList.h API.有关示例代码,请参见http://secondgear-public.googlecode.com/svn/trunk/SGLaunchAtLogin/.您需要的代码在Controller.m中

3> Dirk Stoop..:

使用指向应用程序的文件URL调用下面粘贴的方法,将其添加到当前用户的登录项.

要再次禁用,您需要获取相同的loginListRef,将其转换为数组,然后遍历它,直到找到包含要禁用的URL的项目.最后,使用适当的参数调用LSSharedFileListItemRemove.

祝好运 :)

- (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);
    }
}

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有