Просто се чудя как мога да направя така, че приложението ми да се отваря автоматично при влизане, но това да може да се включва и изключва чрез квадратче за отметка в прозореца с предпочитания.
Как да накарате приложението ви да се отваря при влизане?
Отговори (4)
Има прилично описание на това какво да правите в CocoaDev.
По принцип ще искате да използвате API в LaunchServices/LSSharedFileList.h, ако можете да се насочите към Mac OS X 10.5 или по-нова версия. Преди 10.5 нямаше чист API, така че трябва ръчно да манипулирате елементите за влизане (Примерен код във връзката за разработчициg).
Ето примерен код (мъртъв) за Leopard, който споменах в коментарите. Намерено чрез тази публикация в блог. Кодът, от който се нуждаете, за да активирате или деактивирате стартирането при влизане, е в Controller.m.
LSSharedFileList.h
за приложения в пясъчна среда в Mac App Store: developer.apple.com/library/mac/#documentation/Security/
- person pkamb; 28.09.2012
Ето някакъв код, който използвам, базиран е на изходния код на 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"];
}
Извикайте метода, поставен по-долу, с URL адрес на файл, сочещ към вашето приложение, за да го добавите към елементите за влизане на текущия потребител.
За да деактивирате отново, ще трябва да получите същия loginListRef, да го преобразувате в масив и да преминете през него, докато намерите елемента с URL адреса, който искате да деактивирате. Накрая извикайте LSSaredFileListItemRemove със съответните аргументи.
Късмет :)
- (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);
}
}
Вижте също SO въпрос: Регистриране като елемент за влизане с какао