Есть ли способ отличить приложение, запускаемое 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 словарь, полный значений, который также может быть полезен в случае, если идентификатор пакета не является достаточно значимым.

Другие вопросы по тегам