SMLoginItemSetEnabled(...)GET对应物

Ale*_*ski 23 cocoa objective-c

沙盒应用程序,创建启动项,苹果建议你使用LSRegisterURL(..),并SMLoginItemSetEnabled(..)伴随着一个辅助工具.我已经设置了我想要的一切,但我想要一种方法(不存储偏好值)来获得"如果它已注册"的状态.基本上是一种执行相同操作的方法SMLoginItemGetEnabled(...).

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

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

cks*_*ubs 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;
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*ger 9

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

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

  • 我创建了一些开源代码,简化了使用ServiceManagement添加登录项的过程:https://github.com/alexzielenski/StartAtLoginController (2认同)