0

有没有办法让 C++ 或 Objective-C 程序判断它是作为命令行应用程序(例如./myprog在 shell 中)还是作为应用程序包(例如通过双击 Finder 中的 .app 或open myprog.app/在终端中运行)?

目前我正在使用以下内容。

CFBundleRef bundle = CFBundleGetMainBundle();
CFURLRef bundleUrl = CFBundleCopyBundleURL(bundle);
char bundleBuf[PATH_MAX];
CFURLGetFileSystemRepresentation(bundleUrl, TRUE, (UInt8*) bundleBuf, sizeof(bundleBuf));

此时,bundleBuf现在保存 .app 包的路径包含命令行可执行文件的目录。我可以检查字符串是否以 结尾".app",但这很hacky。有一个更好的方法吗?

4

1 回答 1

1

您可以查询 URL 的统一类型标识符 (UTI)(使用CFURLCopyResourcePropertyForKey()with kCFURLTypeIdentifierKey)并查看它是否符合kUTTypeApplicationBundle(使用UTTypeConformsTo())。

CFStringRef uti;
if (CFURLCopyResourcePropertyForKey(bundleUrl, kCFURLTypeIdentifierKey, &uti, NULL) &&
    uti &&
    UTTypeConformsTo(uti, kUTTypeApplicationBundle))
{
    // Is bundled application
}

使用Objective-C,您可以使用这些NSWorkspace方法-typeOfFile:error:-type:conformsToType:达到相同的目的。

于 2019-10-14T02:05:05.350 回答