Ruby后台OS X应用程序

时间:2010-12-04 23:08:47

标签: ruby macos background

创建ruby OS X应用程序很容易 - 创建如下结构:

xxx.app
└── Contents
    ├── Info.plist
    ├── MacOS
    │   └── xxx
    └── Resources
        └── xxx.icns

并将代码执行到xxx中。但是启动时间很明显,所以我希望这个应用程序保持在后台并运行一些方法,当应用程序打开时:所以当我第一次运行该应用程序时,它执行代码保留在后台,当我再次运行时,应用程序是已经在后台,所以它只运行指定的方法。

最小Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundlePackageType</key>
  <string>APPL</string>
  <key>CFBundleExecutable</key>
  <string>newTabHere</string>
  <key>CFBundleIconFile</key>
  <string>newTabHere</string>
  <key>LSUIElement</key>
  <true/><!-- hides icon from Dock -->
</dict>
</plist>

3 个答案:

答案 0 :(得分:2)

缓慢是由于ruby解释器所需的启动时间。这就是为什么它对bash脚本或objective-c来说并不慢。

与后台ruby计划沟通的步骤:

  • 让你的ruby程序使用daemons gem。(可选,但让在后台运行更容易)
  • 运行时写一个bash脚本telnet到端口。
  • 让您的ruby程序运行eventmachine(可通过Rubygems运行)或其他支持telnet的套接字服务器。
  • 当ruby套接字服务器通过telnet接收消息时,程序将运行您想要的方法。
  • 将bash脚本打包在您在问题中描述的应用程序中。

bash脚本必须:

  1. 启动ruby程序或启动守护程序(如果它尚未在后台运行)。
  2. 使用telnet连接到ruby程序中指定的端口上的localhost
  3. 发送消息以运行该方法。
  4. 保存或打印结果。
  5. 此解决方案的优势

    • 易于实施。
    • Telnet会自动安装在所有Mac上。
    • Bash脚本易于学习使用。
    • Ruby有很好的套接字宝石和易于实现的库。

    警告

    这需要使用ruby解释器不断耗尽计算机的内存。因此,它不是一个用户友好的解决方案。

    要在ruby中使用图形界面创建一个真正的应用程序,您必须使用macruby和rubycocoa。

    或者从Appcelerator使用Titanium Desktop,你必须用javascript编写接口代码,但你可以用ruby完成剩下的工作。该方法还具有跨平台的优点。见http://developer.appcelerator.com/doc/desktop/ruby

答案 1 :(得分:0)

取决于'在后台运行'的含义。要打开它,做它的事情,然后关闭而不以任何方式接管屏幕,你可以设置属性列表以隐藏状态栏图标cite并关闭。您可以使用use automator打开,运行脚本并关闭。

答案 2 :(得分:0)

这应该像你做的那样工作。我用一个简单的脚本作为可执行文件测试了它(在你的代码中脚本代替xxx):

#!/bin/sh
a=0
echo $a >> /tmp/test.txt

我计时了:

> time /usr/bin/open test.app

real    0m0.042s
user    0m0.022s
sys     0m0.010s

因此应用程序在40毫秒内启动(如果背景应该大致同时返回)。问题可能是您打开应用程序的方式(命令行,图标,AppleScript ...)。你能告诉更多吗?

编辑:如果您使用终端打开,则可以使用'&amp;'最后签名(开始后台进程)。如果我这样做,shell将在6毫秒内返回。

BR,

的Juha