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)
我认为您可以使用SMCopyAllJobDictionaries(kSMDomainUserLaunchd)一个包含所有当前活动launchd作业的字典的数组.
根据文档,调用会SMLoginItemSetEnabled()立即启动相关作业,因此如果您的登录任务不在返回的列表中,SMCopyAllJobDictionaries()那么您可能会认为它未设置为在登录时运行.