2010-02-17 6 views
2

La seule façon dont j'ai réussi à obtenir ce travail est avec une application basée sur des documents (que cette application ne est pas). Dans mon application non documentée, j'ai défini les types de documents pris en charge (dans l'onglet Propriétés de la fenêtre Infos cible) et mon AppDelegate implémente application:openFile: et application:openFiles:. Cela permet de déposer des fichiers sur l'icône Dock de l'application lorsqu'elle a déjà été lancée, mais pas sur son icône dans le Finder (lancé ou non). Qu'est-ce que je rate?Comment lancer une application Cocoa non basée sur un document en y déposant des fichiers?

Mise à jour

Comme demandé, mon tableau Types de documents:

<array> 
    <dict> 
     <key>CFBundleTypeExtensions</key> 
     <array> 
      <string>nsf</string> 
      <string>nsfe</string> 
     </array> 
     <key>CFBundleTypeName</key> 
     <string>NSF Soundtrack</string> 
     <key>CFBundleTypeRole</key> 
     <string>None</string> 
     <key>LSTypeIsPackage</key> 
     <false/> 
     <key>NSPersistentStoreTypeKey</key> 
     <string>InMemory</string> 
    </dict> 
</array> 
+0

Veuillez modifier votre question pour inclure votre tableau de types de documents et, si vous utilisez des UTI, vos tableaux d'importation et/ou d'exportation UTI. –

+2

Pourquoi ne pas remplacer 'CFBundleTypeRole' par' Editor'? – Yuji

+0

Gah, mon application n'est ni une 'Viewer' ou' Editor' (elle envoie les fichiers à un autre périphérique sur le réseau local) donc j'ai choisi 'None' pour' CFBundleTypeRole'. En le modifiant à l'une des autres options, cela fonctionne comme prévu. –

Répondre

1

Deux parties de ce qui me font soupçonneux:

<key>CFBundleTypeRole</key> 
    <string>None</string> 

Ne pas vous dire que ce soit Viewer au moins?

<key>NSPersistentStoreTypeKey</key> 
    <string>InMemory</string> 

Qu'est-ce que vous essayez de faire ici? Pourquoi votre fichier sur disque serait-il spécifié en tant que magasin persistant Core Data en mémoire? Si vous voulez simplement mettre le tout en mémoire lorsque vous le chargez, cela s'appelle Binary ou XML, pas InMemory.

Je vous recommande également de définir les UTI pour vos types de document, pas seulement les extensions.

Vous devez également vérifier ce que les services de lancement pensent en cours en utilisant lsregister. Parfois, le problème est que vous avez plusieurs versions de votre application et Launch Services n'a pas trouvé celui que vous pensez qu'il devrait avoir. Vous pouvez consulter la base de données des services de lancement comme ceci: /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump

Cela devrait fonctionner sur 10,5 et 10,6. 10.4 a lsregister dans un endroit différent. J'utilise habituellement locate pour le trouver plutôt que d'essayer de le mémoriser.

+0

Merci pour l'info supplémentaire. Comment puis-je déterminer l'UTI d'un format de fichier ésotérique que je n'ai pas créé? Est-ce que quelque chose comme 'public.data public.item' est assez dans ce cas? 'mdls megaman.nsf' renvoie' kMDItemContentType = "dyn.ah62d4rv4ge80665g" 'Serais-je simplement utiliser cela? –

+0

Vous ne devriez probablement pas inventer un UTI pour les formats de fichiers que vous n'avez pas créés. J'ai supposé que c'était votre propre type de fichier. –

0

Dans vos paramètres cibles, allez dans l'onglet Propriétés et ajouter à la table Types de documents.

+0

Je l'ai déjà fait. "... mon AppDelegate définit les types de documents qu'il supporte ..." –

+0

oh, désolé, je ne savais pas que vous vouliez dire le plist là. –

+0

Pas de soucis, la façon dont je l'ai formulée à l'origine n'a pas été claire. –

Questions connexes