présence d'une application.

tabliertablier Membre
14:48 modifié dans API AppKit #1
Pour que mon appli fonctionne elle doit trouver l'appli qu'elle interroge. Quel est le moyen le plus rapide pour trouvé si "xxxx.app" existe dans un volume donné? je n'ai que le nom de l'appli et le nom du volume.
Merci d'avance

Réponses

  • BruBru Membre
    14:48 modifié #2
    Utilise absolutePathForAppBundleWithIdentifier: de NSWorkspace.

    Cette méthode retourne le chemin de l'appli dont tu fournis le "bundle identifier" (qui est censé être unique sur le système).

    Si le chemin retourné est vide (ou nil, à  tester), c'est que l'appli n'est pas installée.

    .
  • tabliertablier Membre
    14:48 modifié #3
    Ok, "absolutePathForAppBundleWithIdentifier:" ne marche que si c'est un bundle et si l'on connait son "Bundle identifier". Ce n'est pas franchement le cas qui m'occupe car si c'etait un bundle et si j'avais son identifier c'est que je l'aurai lu dans son "info.plist" et dans ce cas je saurais ipso facto que cette appli existe!.  J'ai également trouvé "fullPathForApplication:" qui conviendrai mieux. Dans ce cas la recherche se fait pour tout type d'application, mais seulemnt dans les chemins: "/Network/Applications,  /Applications, /Developer/Applications" se qui est insuffisant!
    A part un itérateur de recherche sur le volume complet (très lent), je ne vois pas d'autre solution.  J'accepte toutes les suggestions!
    Merci pour vos réponses.
  • 14:48 modifié #4
    La solution de bru semble très bonne même un soft Carbon peut être un bundle... Que veut tu rechercher réellement ?
  • BruBru Membre
    14:48 modifié #5
    dans 1127398512:

    Ok, "absolutePathForAppBundleWithIdentifier:" ne marche que si c'est un bundle et si l'on connait son "Bundle identifier". Ce n'est pas franchement le cas qui m'occupe car si c'etait un bundle et si j'avais son identifier c'est que je l'aurai lu dans son "info.plist" et dans ce cas je saurais ipso facto que cette appli existe!.  J'ai également trouvé "fullPathForApplication:" qui conviendrai mieux. Dans ce cas la recherche se fait pour tout type d'application, mais seulemnt dans les chemins: "/Network/Applications,  /Applications, /Developer/Applications" se qui est insuffisant!
    A part un itérateur de recherche sur le volume complet (très lent), je ne vois pas d'autre solution.  J'accepte toutes les suggestions!
    Merci pour vos réponses.


    Tu t'embrouilles !

    Si tu connais son nom, tu peux connaitre son "bundle-identifier" !
    Pour ça, tu installes cette appli, tu visualises son contenu puis son info.plist. Après, tu n'as plus qu'à  mettre cet identifier dans ton programme. Un point c'est tout !

    Après quoi, puisque je suppose que ton appli va être diffusée, cela permettra de vérifier si cette apli est installée ou non (afin d'avertir l'utilisateur par exemple).

    En somme, c'est mettre "en dur" dans ton programme, soit le nom de cette appli, soit son "bundle-identifier".

    Je ne vois vraiment pas où est la difficulté...

    .
  • BruBru Membre
    14:48 modifié #6
    dans 1127393511:

    Pour que mon appli fonctionne elle doit trouver l'appli qu'elle interroge. Quel est le moyen le plus rapide pour trouvé si "xxxx.app" existe dans un volume donné? je n'ai que le nom de l'appli et le nom du volume.
    Merci d'avance


    Les xxx.app sont toujours des bundles sous OSX.

    .
  • tabliertablier Membre
    14:48 modifié #7
    Bien, je vois que je n'ai pas été clair dans ma demande! Désolé, je vais cité des noms!  J'ai écrit une application (Incremental) qui, associé à  CDFinder, permet de gérer les archivages. Un utilisateur Lambda peut très bien avoir téléchargé Incremental sans CDFinder. Mon problème est de trouver la manière de détecter cela pour indiquer à  l'utilisateur ce qu'il doit faire! Ce qui complique les choses: CDF jusqu'à  la version 4.3.2 n'était pas un bundle, mais une appli "Carbon". De plus CDF fonctionne quelque soit l'endroit ou il se trouve dans le volume (pas de position préferentielle).
    Je peux donc reposer ma question: quel est la bonne solution pour qu'Incrémental (avec les conditions exposées ci-dessus) trouve si CDF est ou n'est pas présent?
  • BruBru Membre
    14:48 modifié #8
    Bon, puisque tu es plus précis, alors je vais l'être moi aussi.

    Le plus sûr dans ton cas est d'utiliser les launch-services, et plus particulièrement la fonction LSFindApplicationForInfo qui permet de retrouver une application par son code créateur.

    Pour CDFinder, le code créateur est NDCD (je l'ai récupéré par FileBuddy).
    Donc un test comme celui là  :
    <br />#import &lt;Carbon/Carbon.h&gt;<br />...<br />{<br />    OSStatus err;<br />    CFURLRef url;<br /><br />    err=LSFindApplicationForInfo((OSType)&#39;NDCD&#39;, NULL, NULL, NULL, &amp;url);<br />    if (url==NULL) NSLog(@&quot;CDFinder absent&quot;); //application absente<br />    else NSLog(@&quot;CDFinder présent&quot;); //application présente<br />}<br />
    

    te permet de tester la présence de CDFinder, quelque soit son emplacement sur le système.

    (Ne pas oublier d'inclure le framework Carbon au projet).

    .
  • amnesicamnesic Membre
    septembre 2005 modifié #9
    dans 1127417084:

    Bien, je vois que je n'ai pas été clair dans ma demande!


    Effectivement, c'est plus clair avec des noms ;-)


    À part un itérateur de recherche sur le volume complet (très lent), je ne vois pas d'autre solution.


    J'ai bien peur qu'il n'y ait pas d'autre solution que l'itération si ton application peut se trouver n'importe où. (d'ailleurs, c'est pour ça, que certains installateurs sont lents quelques fois à  installer des applications, car elle vérifie qu'il n'y a pas déjà  une vieille version quelque part)

    [grilled by Bru]
    Par contre, tu n'es pas forcement obligé de l'écrire toi-même, tu dois pouvoir passer par Carbon via LSFindApplicationForInfo (filtre via OSType) ou laissez la commande system_profiler faire le boulot :
    system_profiler -xml SPApplicationsDataType
    Tu peux utiliser NSTask par exemple pour la lancer et récupérer le résultat que tu filtreras pour vérifier la présence de l'application recherchée.

  • mpergandmpergand Membre
    14:48 modifié #10
    Citation de: tablier sur Hier à  09:24:44pm
    Bien, je vois que je n'ai pas été clair dans ma demande!


    Si si, très clair, d' autant que cette question revient régulièrement dans divers forums et malheureusement, à  ma connaissance, il n'y a pas de solution simple sous OS X ( à  l'inverse de OS 9)

    Justement, suite à  une question similaire sur un autre forum, j'avais essayé la fonction  PBDTGetPath (carbon) et ça ne trouve pas les applis en bundle ...


    Code:
    #import <Carbon/Carbon.h>
    ...
    {
        OSStatus err;
        CFURLRef url;

        err=LSFindApplicationForInfo((OSType)'NDCD', NULL, NULL, NULL, &url);
        if (url==NULL) NSLog(@CDFinder absent); //application absente
        else NSLog(@CDFinder présent); //application présente
    }
    te permet de tester la présence de CDFinder, quelque soit son emplacement sur le système.


    Nonobstant, cela mériterait une petite vérification, car je ne saurais être aussi affirmatif...

    Voila, à  mon humble avis, le plus simple serait encore de demander à  utilisateur de désigner l'emplacement de cette appli...

    Sinon, à  partir de Tiger, on doit pouvoir utiliser Spotlight  ::)
  • BruBru Membre
    14:48 modifié #11
    dans 1127467472:

    Nonobstant, cela mériterait une petite vérification, car je ne saurais être aussi affirmatif...


    Nonobstante, mon cher, nonobstante...

    Je peux être affirmatif (d'autant plus que, bien sûr, j'ai vérifié et testé).
    Pour info, j'ai téléchargé l'appli CDFinder version carbon OS9 non bundleà¯sé. Cette appli était dans un dossier posé sur mon bureau.

    LSFindApplicationForInfo a parfaitement retrouvé cette appli (un NSLog sur l'url retourné affichant "/users/bruno/desktop/cdfinder%2044.3/cdfinder" de mémoire).

    seul bémol à  cette technique, les applications qui ont été copiées sur le système sans passer par le Finder (par drag'n drop) ou par un instaleur non standard, ne sera sans doute pas connu du système. LSFindApplicationForInfo sera donc inefficace dans ce cas.

    Dans un tel cas, on peut toujours afficher un message à  l'utilisateur en disant que l'appli n'a pas été détectée et en lui laissant la possibilité de la rechercher manuellement.

    .
  • mpergandmpergand Membre
    14:48 modifié #12
    :) :) :)

    Bon, comme tu le dis toi même, c'est pas sûr à  100%
    Et de plus, faudrait vérifier sur les différentes versions de OS X...

    Donc, moralité, on effectue une recherche basique et si on trouve pas, on demande à  l'utilisateur et voilou !
  • 14:48 modifié #13
    Autant vérifier si une préférence de CFFinder est présente dans ~/Library/Preferences...
Connectez-vous ou Inscrivez-vous pour répondre.