SMLoginItemSetEnabled(...)GET对应物

时间:2011-11-21 23:17:18

标签: objective-c cocoa

对于沙盒应用,要创建启动项,Apple建议您使用LSRegisterURL(..)SMLoginItemSetEnabled(..)以及辅助工具。我已经设置了我想要的一切,但我想要一种方法(不存储偏好值)来获得“如果它已注册”的状态。基本上是一种与SMLoginItemGetEnabled(...)执行相同操作的方法。

编辑:感谢Rob Keniger的回答,这是我的最终代码:

- (BOOL)startAtLogin {
    NSDictionary *dict = (NSDictionary*)SMJobCopyDictionary(kSMDomainUserLaunchd, 
                                                            CFSTR("com.yourcompany.app"));
    BOOL contains = (dict!=NULL);
    [dict release];
    return contains;
}

2 个答案:

答案 0 :(得分:10)

接受的答案对我不起作用。这篇博客说“// Note: Sandbox issue when using SMJobCopyDictionary()”一定是问题所在。因此,如果您在沙箱中使用接受的答案时遇到问题,请尝试使用此方法。为我工作。

所有这一切都归功于Mike Cohen。有关更多信息,请参阅他的博文:

http://blog.mcohen.me/2012/01/12/login-items-in-the-sandbox/

-(BOOL)appIsPresentInLoginItems
{
    NSString *bundleID = @"com.madebynotion.myLoginHelper";
    NSArray * jobDicts = nil;
    jobDicts = (NSArray *)SMCopyAllJobDictionaries( kSMDomainUserLaunchd );
    // Note: Sandbox issue when using SMJobCopyDictionary()

    if ( (jobDicts != nil) && [jobDicts count] > 0 ) {

        BOOL bOnDemand = NO;

        for ( NSDictionary * job in jobDicts ) {

            if ( [bundleID isEqualToString:[job objectForKey:@"Label"]] ) {
                bOnDemand = [[job objectForKey:@"OnDemand"] boolValue];
                break;
            } 
        }

        CFRelease((CFDictionaryRef)jobDicts); jobDicts = nil;
        return bOnDemand;

    } 
    return NO;
}

答案 1 :(得分:9)

我认为您可以使用SMCopyAllJobDictionaries(kSMDomainUserLaunchd)来获取包含所有当前活动launchd作业的字典的数组。

根据文档,调用SMLoginItemSetEnabled()会立即启动相关作业,因此如果您的登录任务不在SMCopyAllJobDictionaries()返回的列表中,那么您可能会认为它未设置为在登录时运行