对于沙盒应用,要创建启动项,Apple建议您使用LSRegisterURL(..)
和SMLoginItemSetEnabled(..)
以及辅助工具。我已经设置了我想要的一切,但我想要一种方法(不存储偏好值)来获得“如果它已注册”的状态。基本上是一种与SMLoginItemGetEnabled(...)
执行相同操作的方法。
- (BOOL)startAtLogin {
NSDictionary *dict = (NSDictionary*)SMJobCopyDictionary(kSMDomainUserLaunchd,
CFSTR("com.yourcompany.app"));
BOOL contains = (dict!=NULL);
[dict release];
return contains;
}
答案 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()
返回的列表中,那么您可能会认为它未设置为在登录时运行