Il problema: le cartelle .itmsp sono mostrate come file
Il Finder tratta le cartelle .itmsp come pacchetti , ovvero come se fossero un singolo file. Ad esempio, nella vista colonna, tutto ciò che è contenuto nella cartella .itmsp è invisibile, viene mostrata solo l'icona del documento:
Il Finder considera una directory come un pacchetto se si verifica una delle seguenti condizioni (dalla Guida alla programmazione del pacchetto ):
La directory ha un'estensione di file nota: .app, .bundle, .framework, .plugin, .kext e così via (come definito in /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. Questo è un plist binario, aprilo con Xcode:) open -a Xcode Info.plist
.
La directory ha un'estensione che alcune altre rivendicazioni dell'applicazione rappresentano un tipo di pacchetto (cercare com.apple.package
nell'output di mdls -name kMDItemContentTypeTree <foldername>
per scoprirlo).
La directory ha il bit del pacchetto impostato (se GetFileInfo -ab <foldername>
restituito 1
, è impostato).
Il caso 2. si applica alle cartelle .itmsp: Application Loader.app
esporta il tipo com.apple.itunes-producer.itmsp
e lo imposta in conformità a com.apple.package
:
$ mkdir foo.itmsp
$ mdls -name kMDItemContentTypeTree foo.itmsp/
kMDItemContentTypeTree = (
"com.apple.itunes-producer.itmsp",
"com.apple.package",
(...)
)
$ grep -B 5 -A 8 com.apple.package /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Info.plist
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>com.apple.package</string>
<string>public.composite-content</string>
</array>
<key>UTTypeDescription</key>
<string>iTunes Package</string>
<key>UTTypeIconFile</key>
<string>ITMSP.icns</string>
<key>UTTypeIdentifier</key>
<string>com.apple.itunes-producer.itmsp</string>
Una soluzione: ri-dichiarare il tipo com.apple.itunes-producer.itmsp
Una soluzione sarebbe quella di ri-dichiarare il tipo com.apple.itunes-producer.itmsp
e l'estensione itmsp
come una cartella e forzare i Servizi di avvio a utilizzare la dichiarazione di tipo modificata.
Nota importante:
Sebbene risolva in modo affidabile il problema dell'OP, la soluzione proposta, quando applicata ad altri pacchetti, non li visualizza come cartelle.
Ho scoperto che la soluzione proposta sembra funzionare solo con i tipi di file dichiarati dalle applicazioni situate in un percorso dell'applicazione non standard.
Questo è il caso di Application Loader.app
, che si trova in /Applications/Xcode.app/Contents/Applications/
.
Se sei interessato a una soluzione parziale, controlla la fine di questa risposta.
Per fare in modo che le cartelle .itmsp vengano visualizzate come cartelle dal Finder, procedi come segue:
Apri Automator nella cartella Applicazioni e seleziona Applicazione :
Seleziona Utilità nell'elenco Libreria, seleziona Esegui script shell e trascinalo nel riquadro a destra:
Sostituisci il contenuto dello script predefinito con exit 0
:
Salvare l'applicazione come itmspOpener:
Chiudi Automator.
Seleziona itmspOpener.app
e mostra i suoi contenuti:
Individua Contenuti> Info.plist e aprilo con il tuo editor preferito:
Sostituisci queste sezioni in Info.plist
:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>itmsp</string>
</array>
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleTypeIconFile</key>
<string>folder</string>
<key>LSTypeIsPackage</key>
<false/>
<key>LSHandlerRank</key>
<string>Owner</string>
</dict>
</array>
(...)
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>kUTTypeDirectory</string>
</array>
<key>UTTypeDescription</key>
<string>itmsp folder</string>
<key>UTTypeIconFile</key>
<string>folder.icns</string>
<key>UTTypeIdentifier</key>
<string>com.apple.itunes-producer.itmsp</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>itmsp</string>
</dict>
</dict>
</array>
Nota:
perché kUTTypeDirectory
anziché public.directory
in UTExportedTypeDeclarations
? Dalla documentazione di Apple : Importante: quando si utilizzano UTI definite dal sistema nel codice, è necessario utilizzare le costanti definite nel UTCoreTypes.h
framework Launch Services quando disponibili, anziché le stringhe UTI effettive. Ad esempio, passa kUTTypeApplication anziché "com.apple.application". "Identificatori di tipo uniformi dichiarati dal sistema" elenca queste costanti oltre alle stringhe UTI.
Associare un file .itmsp a itmspOpener
e premere il pulsante Change All...:
Reimposta il database di Launch Services:
$ lsregister -kill -r -domain local -domain system -domain user
(su OS X 10.8 lsregister
si trova in /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
.)
Crea una cartella .itmsp ed elenca le sue proprietà:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Poiché il database di Launch Services è stato ripristinato, ora il Finder mostra le cartelle .itmsp come cartelle.
Apri itmspOpener.app
per caricare il suo file plist e registrarti com.apple.itunes-producer.itmsp
:
$ open ~/Desktop/itmspOpener.app
Inizio Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
La cartella foo3.itmsp
deve comunque essere visualizzata come cartella.
Controlla di nuovo le proprietà della cartella:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
non è stato aggiunto agli attributi dei metadati della cartella, ecco perché il Finder mostra ancora le cartelle .itmsp come cartelle!
Soluzione automatizzata: visualizzazione delle cartelle .itmsp come cartelle dopo il login
Per visualizzare le cartelle .itmsp come cartelle dopo il login:
Crea itmspOpener.app
e modifica il suo Info.plist
come descritto sopra.
Crea /usr/local/bin/itmspTypeLoader
con questo contenuto (la variabile itmspOpener
punta alla posizione in cui itmspOpener.app
risiede, cambia se necessario):
#!/bin/bash
itmspOpener="/Users/jaume/Applications/itmspOpener.app/"
echo "$(date): Starting" > /tmp/itmspTypeLoader.log
sleep 15
echo "$(date): Deleting Launch Services database" >> /tmp/itmspTypeLoader.log
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user >> /tmp/itmspTypeLoader.log
sleep 15
echo "$(date): Starting $itmspOpener" >> /tmp/itmspTypeLoader.log
open $itmspOpener >> /tmp/itmspTypeLoader.log
sleep 1
echo "$(date): Starting Application Loader.app" >> /tmp/itmspTypeLoader.log
open "/Applications/Xcode.app/Contents/Applications/Application Loader.app/"
# Wait until process "Application Loader.app" exists
while [ $(ps -ef|grep -v grep|grep -c "Application Loader") -ne 1 ]; do
sleep 1
echo "$(date): Waiting" >> /tmp/itmspTypeLoader.log
done
# Send TERM signal
kill -TERM $(ps -ef|grep "Application Loader"|grep -v grep|awk "{print \$2}")
if [ $? -eq 0 ]; then
echo "$(date): Application Loader killed" >> /tmp/itmspTypeLoader.log
else
echo "$(date): Application Loader could not be killed" >> /tmp/itmspTypeLoader.log
fi
echo "$(date): Exiting" >> /tmp/itmspTypeLoader.log
Sia sleep 15
prima che dopo la corsa lsregister
sono della massima importanza. Se non vedi il risultato desiderato, prova diversi ritardi.
Crea /usr/local/bin/itmspTypeLoaderLauncher
con questo contenuto:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
Imposta entrambi gli script eseguibili:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Imposta /usr/local/bin/itmspTypeLoaderLauncher
come hook di accesso :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
Riavvia per rendere effettive le modifiche. Dopo aver effettuato l'accesso dovresti vedere questo:
e lsregister -dump
dovrebbe rivelare che itmspOpener.app
's UTExportedTypeDeclarations
ha la precedenza su Application Loader.app
' s:
$ lsregister -dump | less
bundle id: 24748
path: /Users/jaume/Desktop/itmspOpener.app/
name: itmspOpener
(...)
flags: apple-internal relative-icon-path ui-element has-min-sys-version-by-arch hi-res-capable user-can-change-hi-res-mode
item flags: container package application extension-hidden native-app scriptable services x86_64
(...)
--------------------------------------------------------
type id: 33796
uti: com.apple.itunes-producer.itmsp
description: itmsp folder
flags: exported active apple-internal trusted
icon: Contents/Resources/folder.icns
conforms to: kuttypedirectory
tags: .itmsp
--------------------------------------------------------
(...)
bundle id: 24600
path: /Applications/Xcode.app/Contents/Applications/Application Loader.app/
name: Application Loader
(...)
flags: apple-internal relative-icon-path hi-res-capable user-can-change-hi-res-mode
item flags: container package application extension-hidden native-app i386 x86_64
(...)
--------------------------------------------------------
type id: 33832
uti: com.apple.itunes-producer.itmsp
description: iTunes Package
flags: exported inactive apple-internal trusted
icon: Contents/Resources/ITMSP.icns
conforms to: com.apple.package, public.composite-content
tags: .itmsp
--------------------------------------------------------
Vedi il inactive
flag impostato nell'esportazione del tipo di Loader.app dell'applicazione? Abbiamo sconfitto il Caricatore applicazioni.
Il test dell'acido: le cartelle .itmsp vengono ancora visualizzate come tali dopo l'aggiornamento di iTunes
Ho recentemente aggiornato Xcode:
e può confermare che le cartelle .itmsp sono state mostrate come cartelle durante l'aggiornamento:
e successivamente:
Una soluzione parziale: il pacchetto mostrerà i contenuti facendo doppio clic
Come precedentemente commentato, la procedura sopra descritta non funziona con cartelle arbitrarie che vengono visualizzate come pacchetti dal Finder.
Tuttavia, se vuoi solo essere in grado di fare doppio clic su un pacchetto per aprirlo, c'è un modo per farlo con uno bash
script e Automator:
Lo script crea una cartella nascosta temporanea all'interno del pacchetto, la rivela nel Finder (rivelando così il pacchetto come cartella) e quindi elimina la cartella temporanea.
Nota:
Lo script potrebbe invece creare un file temporaneo nascosto. Tuttavia, preferisco creare una cartella perché rmdir
elimina solo le cartelle vuote , mentre rm
elimina qualsiasi file, quindi se, per qualche motivo. lo script crea scompiglio, verranno eliminate solo le cartelle vuote, il che probabilmente non è così grave come se i file fossero eliminati.
Automator raggruppa lo script in un'applicazione che verrà associata ai file del pacchetto.
Questi sono i passaggi per creare una tale applicazione. Userò i file .itmsp come esempio di tipo di pacchetto nella spiegazione seguente:
Apri Automator nella cartella Applicazioni e seleziona Applicazione :
Seleziona Utilità nell'elenco Libreria, seleziona Esegui script shell e trascinalo nel riquadro a destra:
Imposta Passa input a come argomenti :
Sostituisci il contenuto dello script predefinito con questo:
for f in "$@"; do
# If not dealing with a directory, exit
if [ ! -d "$f" ]; then exit; fi
# Create a temporary directory inside the itmsp "file"
tmpdir="$f/.itmspOpener$$"
if mkdir $tmpdir; then
# Reveal in Finder
open -R $tmpdir
# Delete temporary file
rmdir $tmpdir
fi
done
Salvare l'applicazione come itmspOpener:
Chiudi Automator.
Ora hai un'applicazione che può aprire i file .itmsp come cartelle se associati ad essa.
C'è un problema estetico: così com'è, i file associati avranno l'icona standard del documento bianco:
Risolviamo anche questo:
Assicurarsi che Automator sia chiuso.
Seleziona itmspOpener e mostra i suoi contenuti:
Individua Contenuti> Info.plist e aprilo con il tuo editor preferito:
Sostituisci il valore per questa chiave CFBundleDocumentTypes
nell'array:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
e aggiungi questa chiave:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Ora, la sezione è simile alla seguente:
Passa al Finder, seleziona una cartella, premi ⌘I, seleziona l'icona della cartella nell'angolo in alto a sinistra e copiala con ⌘C:
Apri l'anteprima e seleziona File> Nuovo dagli Appunti. Salva il file come folder.icns
:
Copia folder.icns
in itmspOpener/Contents/Resources
:
Associare un file .itmsp a itmspOpener
e premere il pulsante Change All...:
L'icona dei file .itmsp dovrebbe cambiare in una cartella, o almeno lo pensavo: sfortunatamente, non era così. Quindi ho spostato l'applicazione itmspOpener in un'altra posizione (ho creato una cartella temporanea sul mio desktop, spostata lì e di nuovo sul mio desktop). Che ha aggiornato le informazioni dell'icona nel Finder:
Ora fai doppio clic su un file .itmsp e guardalo aperto come una cartella: