Macos 有没有办法区分登录时启动服务启动的应用程序和用户启动的应用程序?

Macos 有没有办法区分登录时启动服务启动的应用程序和用户启动的应用程序?,macos,cocoa,startup,launch-services,Macos,Cocoa,Startup,Launch Services,Cocoa应用程序可以将自己添加到LSSharedFileList的登录项目列表中。这将允许在用户登录时启动应用程序。但是,有没有办法判断用户是在登录时启动应用程序还是自动启动应用程序?这很有用,因为在一种情况下,我们可以显示用户界面,在另一种情况下,我们可以隐藏UI并在后台以菜单栏应用程序的形式运行应用程序 这里有一些代码。我不确定它会为登录项返回什么,但如果你尝试一下并发表评论,我会更新帖子。对于Finder,它确实返回com.apple.Finder,对于Xcode,它返回com.appl

Cocoa应用程序可以将自己添加到
LSSharedFileList
的登录项目列表中。这将允许在用户登录时启动应用程序。但是,有没有办法判断用户是在登录时启动应用程序还是自动启动应用程序?这很有用,因为在一种情况下,我们可以显示用户界面,在另一种情况下,我们可以隐藏UI并在后台以菜单栏应用程序的形式运行应用程序

这里有一些代码。我不确定它会为登录项返回什么,但如果你尝试一下并发表评论,我会更新帖子。对于Finder,它确实返回
com.apple.Finder
,对于Xcode,它返回
com.apple.dt.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
是一个充满值的字典,如果包标识符没有足够的意义,它可能也会很有帮助。

这个方法很好,但现在是苹果CDO(首席弃用官)终于成功地弃用了
GetCurrentProcess
ProcessInformationCopyDictionary
GetProcessInformation
。他说我们应该使用
NSRunningApplication
。您知道这可能如何工作吗?快速扫描文档,您可以尝试
[[NSRunningApplication runningapplication withprocessidentifier:getppid()]bundleIdentifier]
。抱歉,这不起作用。在我测试的情况下,该表达式的计算结果总是
nil
:作为登录项启动;从Xcode开始;通过Finder启动。我分别在两个地方进行了测试,结果相同:在main()中,以及在-applicationdFinishLaunching之后: