2

我正在将一些 Cocoa 功能包装在一个 Objective-C 库中,该库将从跨平台 C 库中调用。我的目标之一是为在 Linux 上使用 C 语言进行开发的人提供部署到 OSX 的能力,而无需进入 XCode、nib 文件等。我希望他们能够使用 OSX 编译和链接他们的代码命令行工具,最后是一个带有常用按钮等的常规可调整大小的主窗口,一个应用程序菜单和一个外观和行为符合预期的停靠图标等。

我正在使用 OSX 10.8.5。我安装了 XCode 5.0。这是我的gcc --version输出:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.76) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

我已经想出了如何在不使用 XCode 或任何 nib 或 plist 的情况下以编程方式呈现主窗口、如何设置应用程序菜单以及各种其他东西,但我遇到了停靠图标的问题。

我通过调用设置自定义停靠图标图像:

[NSApp setApplicationIconImage:dockImage];

当用户退出应用程序时,停靠图标图像会在离开之前短暂恢复为其他东西(某种默认应用程序图标或视图)。如果不使用 XCode 创建 nib 或 plist,如何防止这种情况发生?

我尝试NSApp在应用程序委托的方法中将激活策略设置为禁止applicationShouldTerminate,以尝试在此切换回发生之前隐藏停靠图标。这没有帮助,它确实隐藏了窗口和停靠图标,但停靠图标仍会短暂切换回默认图标,作为隐藏过程的一部分。我通过返回确认了这一点NSTerminateLator,并确认将激活策略设置为禁止确实会导致停靠栏和图标隐藏,即使应用程序没有终止,并且不设置它会使其不隐藏。

我试过子类NSApplication化和覆盖setApplicationIconImage调用。我已经确认它被第二次调用,不是我的代码(好吧,或者不是直接由我的代码,无论如何),就在程序退出之前。我已经尝试通过第一次调用超级函数而不是第二次来阻止对它的第二次调用,并且我已经确认该函数中的代码可以阻止我的代码更改应用程序图标,但这并没有不解决问题。无论如何,它仍然会以某种方式发生。

我也尝试过删除应用程序徽章,如下所示:

[[window dockTile] setShowsApplicationBadge: NO];

以防万一它与此有关,但这不起作用。文档说应用程序徽章从 10.6 起不再相关,但我抓住了稻草。

在编程方面被难住了,我现在正试图找出如何在不使用 XCode 的情况下从头开始打包 .app,看看是否可以从头开始创建一个 plist,其中包含对应用程序图像的引用。但是一个程序化的解决方案会更好,因为我真的很想尽量减少特定于 OSX 的部署包中的内容。

另一种可能性可能是使用一次 XCode,以生成一个非常通用的、简单的 .app,我的部署脚本会复制和更改它。

请不要把我的问题说成“太宽泛”或“没有建设性”或类似的问题。我意识到我正在重新发明已经以各种形式存在的轮子,但是没有法律禁止尝试建造一个更好的捕鼠器,或者只是一个不同的或更糟糕的捕鼠器,就此而言。我意识到我正在尝试解决一个很多人认为无关紧要的问题,但是 XCode 生成的应用程序没有这个问题,我真的不希望我正在创建的工具生成任何用户可见的像这样的文物。我无意贬低苹果的工具链,也无意就我所追求的东西是否应该被追求而引发争论。我有一个特定的技术问题,我正在寻找解决方案,这在我的目标限制范围内。

4

0 回答 0