2010-12-04 20 views
3

Il est facile de créer l'application Ruby OS X - Création d'une structure comme ceci:Ruby fond OS X app

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

et mettre le code à exécuter dans xxx. Mais le temps de lancement est notable, donc je veux que cette application reste en arrière-plan et exécute une méthode, quand l'application est ouverte: donc quand je lance cette application pour la première fois, elle exécute le code et reste en arrière-plan. déjà en arrière-plan, donc il exécute simplement la méthode spécifiée.

minimale 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> 
+0

@tig Ceci est une excellente question/conseil en soi. Étant donné que vous avez placé xxx dans trois endroits et que vous dites "mettre du code à exécuter dans xxx", est-ce que vous avez besoin d'avoir la même chaîne pour les trois? – Phrogz

+0

@Phrogz: Cette structure est standard pour les applications OS X, donc les noms des fichiers exécutables et icns sont spécifiés dans 'Info.plist' et ces noms peuvent être différents. J'ajouterai un contenu de 'Info.plist' minimal à la question. – tig

+0

@Phrogz: A propos de ma question - il me semble que la création d'une telle application est une sorte de piratage, car l'icône de l'application rebondit dans Dock jusqu'à la fin du programme et l'ouverture de l'application avec un script long à l'intérieur. ne fait rien, donc il semble qu'il est difficile ou impossible de créer une boucle en cours d'exécution dans une telle application. Je pense que je devrais utiliser MacRuby si je veux créer une application OS X en utilisant ruby. – tig

Répondre

2

La lenteur est due au temps de démarrage requis pour l'interpréteur Ruby. C'est pourquoi il n'est pas lent pour un script bash ou un objectif-c.

étapes pour communiquer avec le programme de rubis de fond:.

  • Faites votre programme rubis utiliser le daemons gem (en option, mais fait en cours d'exécution en arrière-plan plus facile)
  • Ecrire un script bash telnet à un port quand couru.
  • Faites exécuter votre programme ruby ​​eventmachine (disponible via Rubygems) ou un autre serveur de socket prenant en charge telnet.
  • Lorsque le serveur socket ruby ​​reçoit le message via telnet, le programme exécute la méthode souhaitée.
  • Intégrez le script bash dans une application comme celle décrite dans votre question.

Le script bash doit:

  1. Lancer le programme rubis ou démarrer le démon si elle est pas déjà en arrière-plan.
  2. Se connecter avec telnet à localhost sur le port spécifié dans le programme ruby ​​
  3. Envoyer un message pour exécuter la méthode.
  4. Enregistrez ou imprimez le résultat.

Avantages à cette solution

  • Facile à mettre en œuvre.
  • Telnet est automatiquement installé sur tous les macs.
  • Les scripts Bash sont faciles à apprendre à utiliser.
  • Ruby a de bonnes gemmes de socket et des bibliothèques faciles à implémenter.

Avertissement

Cela a le coût d'utilisation constamment la mémoire de l'ordinateur avec l'interpréteur Ruby. Donc, ce n'est pas une solution conviviale. Pour créer une véritable application avec une interface graphique en ruby, vous devez utiliser macruby avec rubycocoa.

Ou utilisez le Titanium Desktop d'Appcelerator, vous devrez écrire le code d'interface en javascript mais vous pouvez faire le reste avec ruby. Cette méthode a également l'avantage d'être multi-plateforme. voir http://developer.appcelerator.com/doc/desktop/ruby

0

dépend de ce que vous entendez par «en arrière-plan. Pour l'ouvrir, faire son truc, et fermer sans prendre l'écran de quelque façon que ce soit, vous pouvez probablement définir la liste des propriétés pour masquer l'icône de la barre d'état cite et la fermer. Vous pouvez utiliser l'automate d'utilisation pour ouvrir, exécuter le script et fermer.

+1

Non, son LSUIElement est déjà vrai, je veux dire rester en arrière-plan et exécuter une méthode lorsque l'application est appelée une autre fois. Mon intention est de minimiser le temps passé sur l'ouverture de l'application, en commençant ruby ​​interpretter, etc ... – tig

0

Cela devrait fonctionner comme vous l'avez fait. Je l'ai testé avec un script simple exécutable (dans votre code le script est à la place de xxx):

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

Et je l'ai chronométré:

> time /usr/bin/open test.app 

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

Ainsi, l'application démarre en 40 ms (et si l'arrière-plan devrait revenir à peu près en même temps). Le problème pourrait être comment vous ouvrez l'application (ligne de commande, icône, applescript ...). Pourriez-vous en dire plus?

éditer: Si vous utilisez un terminal pour l'ouvrir, vous pouvez utiliser le signe '&' à la fin (démarre un processus d'arrière-plan). Si je fais cela, le shell revient en 6 ms.

br,

Juha