Есть ли способ отличить приложение, запускаемое Launch Services при входе в систему или по пользователю?
Какао приложение может добавить себя в LSSharedFileList
список элементов входа. Это позволит запускать приложение при входе пользователя в систему. Однако есть ли способ узнать, запустил ли пользователь приложение или приложение автоматически запустилось при входе в систему? Это полезно, потому что в одном случае мы можем отображать пользовательский интерфейс, в другом мы можем скрыть пользовательский интерфейс и запустить приложение в фоновом режиме как приложение с меню.
1 ответ
Вот код для этого. Я не уверен, что он возвращает для элементов входа, но если вы попробуете это и прокомментируете, я обновлю пост. Это возвращает com.apple.Finder
для поиска и com.apple.dt.Xcode
для Xcode.
+ (NSString *) bundleIdentifierOfParentProcess {
NSString *result = nil;
ProcessSerialNumber psn = {0, 0};
if (0 == GetCurrentProcess(&psn)) {
ProcessInfoRec myProcessInfo;
myProcessInfo.processInfoLength = sizeof(ProcessInfoRec);
myProcessInfo.processName = NULL;
myProcessInfo.processAppRef = NULL;
if (0 == GetProcessInformation(&psn, &myProcessInfo)) {
ProcessSerialNumber parentPSN = myProcessInfo.processLauncher;
CFDictionaryRef parentProcessInfo =
ProcessInformationCopyDictionary(&parentPSN,
kProcessDictionaryIncludeAllInformationMask);
if (parentProcessInfo) {
result =
[(__bridge NSDictionary *) parentProcessInfo objectForKey:
(__bridge id) kCFBundleIdentifierKey];
CFRelease(parentProcessInfo);
}
}
}
return result;
}
parentProcessInfo
словарь, полный значений, который также может быть полезен в случае, если идентификатор пакета не является достаточно значимым.