【问题标题】:Create simple cocoa application wrapper创建简单的可可应用程序包装器
【发布时间】:2010-01-30 12:42:09
【问题描述】:

我有一个应用程序,我想将(与一些附加文件)捆绑在一个包装应用程序中。

从字面上看,我唯一想做的就是让包装应用程序启动一个资源文件(即好像我输入了:

/path/to/Resources/Bundled.app/Contents/MacOS/executable

进入终端。

有意义吗?我认为这应该很简单,但我找不到简单的方法来做到这一点——至少可以说,我的可可编程是有限的。

提前致谢!

【问题讨论】:

  • 您可以使用[[[NSBundle mainBundle] executablePath] stringByDeletingLastPathComponent]获取MacOS文件夹的路径。

标签: cocoa wrapper bundle launcher


【解决方案1】:

如果封装的“应用程序”只是一个 shell 脚本或其他东西,一种方法是 Platypus

如果它是一个实际的应用程序(.app 包),为什么应用程序 A 除了启动应用程序 B 什么都不做?为什么要有应用 A?

【讨论】:

  • 出于两个原因-首先因为应用程序 B 有几个资源,它需要与应用程序本身位于同一文件夹中(我无法控制此行为,这是第 3 方的东西)--这样我就可以将它们捆绑在一起作为一个单独的包。其次,因为在未来的某个时候,我可能希望包装器做一些更智能的事情,比如在多个应用程序之间进行选择。
【解决方案2】:

您的外部程序可以使用 NSBundle 在外部程序的包中定位内部程序。

运行内部程序:如果是应用程序,使用Launch ServicesNSWorkspace;如果是命令行工具,请使用NSTask

【讨论】:

    【解决方案3】:

    我有一篇关于此的博文:Turn any shell script into a double-clickable app。该条目提到“从一个空的应用程序包开始”......如果我没记错的话,你可以使用提到的 Pashua 工具来获得它......

    【讨论】:

      【解决方案4】:

      只是为了后代(如果它对其他人有帮助,这里是我使用的完整代码(在 AppDelegate.m 文件中):

      NSString *appName = @"";
      NSString *bundledApp = [[NSBundle bundleWithPath:[[NSBundle
                                                                 mainBundle] pathForResource:appName ofType:@"app"]]
                                bundlePath];
      NSWorkspace *launchApp = [[NSWorkspace alloc] init];
      NSLog(@"Launching %s", bundledApp);
      [launchApp launchApplication:bundledApp];
      [launchApp release];
      
      // Make Launcher terminate (if it serves no other purpose)
      [NSApp terminate:nil];
      

      【讨论】:

      • 谢谢,但不应该使用 [NSWorkspace sharedWorkspace] 来代替分配新实例吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多