O problema: as pastas .itmsp são mostradas como arquivos
O Finder trata as pastas .itmsp como pacotes , ou seja, como se fossem um único arquivo. Por exemplo, no modo de exibição de coluna, qualquer coisa contida na pasta .itmsp é invisível, apenas o ícone do documento é mostrado:
O Finder considera um diretório como um pacote se alguma das seguintes condições for verdadeira (no Guia de programação de pacotes ):
O diretório possui uma extensão de nome de arquivo conhecida: .app, .bundle, .framework, .plugin, .kext e assim por diante (conforme definido em /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. Este é um argumento binário, abra-o com o Xcode:) open -a Xcode Info.plist
.
O diretório tem uma extensão que outras reivindicações de aplicativos representam um tipo de pacote (procure com.apple.package
na saída de mdls -name kMDItemContentTypeTree <foldername>
para descobrir).
O diretório tem seu bit de pacote definido (se GetFileInfo -ab <foldername>
retornar 1
, está definido).
O caso 2. se aplica às pastas .itmsp: Application Loader.app
exporta o tipo com.apple.itunes-producer.itmsp
e o configura para 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>
Uma solução: declarar novamente o tipo com.apple.itunes-producer.itmsp
Uma solução seria declarar novamente o tipo com.apple.itunes-producer.itmsp
e a extensão itmsp
como uma pasta e forçar o Launch Services a usar a declaração de tipo modificada.
Nota importante:
Embora resolva o problema do OP de maneira confiável, a solução proposta, quando aplicada a outros pacotes, não os exibe como pastas.
Descobri que a solução proposta parece funcionar apenas com tipos de arquivos declarados por aplicativos localizados em um caminho de aplicativo não padrão.
É o caso de Application Loader.app
, localizado em /Applications/Xcode.app/Contents/Applications/
.
Se você estiver interessado em uma solução parcial, verifique o final desta resposta.
Para que as pastas .itmsp sejam exibidas como pastas pelo Finder, siga as próximas etapas:
Abra o Automator na pasta Aplicativos e selecione Aplicativo :
Selecione Utilitários na lista Biblioteca, selecione Executar Shell Script e arraste-o para o painel à direita:
Substitua o conteúdo padrão do script por exit 0
:
Salve o aplicativo como itmspOpener:
Feche o Automator.
Selecione itmspOpener.app
e mostre seu conteúdo:
Localize Conteúdo> Info.plist e abra-o com seu editor favorito:
Substitua estas seções em 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:
Por que kUTTypeDirectory
, em vez de public.directory
nos UTExportedTypeDeclarations
? Na documentação da Apple : Importante: Ao usar UTIs definidas pelo sistema em seu código, você deve usar as constantes definidas UTCoreTypes.h
na estrutura do Launch Services quando disponíveis, em vez das cadeias de caracteres reais da UTI. Por exemplo, passe kUTTypeApplication em vez de "com.apple.application". “Identificadores de tipo uniforme declarados pelo sistema” lista essas constantes além das seqüências de caracteres da UTI.
Associe um arquivo .itmsp ae itmspOpener
pressione o botão Change All...:
Redefina o banco de dados do Launch Services:
$ lsregister -kill -r -domain local -domain system -domain user
(no OS X 10.8 lsregister
está localizado em /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
.)
Crie uma pasta .itmsp e liste suas propriedades:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Como o banco de dados dos Serviços de Inicialização foi redefinido, agora o Finder mostra pastas .itmsp como pastas.
Abra itmspOpener.app
para carregar seu arquivo plist e registre com.apple.itunes-producer.itmsp
- se :
$ open ~/Desktop/itmspOpener.app
Início Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
A pasta foo3.itmsp
ainda deve ser exibida como uma pasta.
Verifique as propriedades da pasta novamente:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
não foi adicionado aos atributos de metadados da pasta, é por isso que o Finder ainda exibe pastas .itmsp como pastas!
Solução automatizada: exibindo pastas .itmsp como pastas após o login
Para exibir pastas .itmsp como pastas após o login:
Crie itmspOpener.app
e modifique-o Info.plist
conforme descrito acima.
Crie /usr/local/bin/itmspTypeLoader
com este conteúdo (a variável itmspOpener
aponta para o local em que itmspOpener.app
reside, altere conforme necessário):
#!/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
Ambos sleep 15
antes e depois de correr lsregister
são de extrema importância. Se você não encontrar o resultado desejado, tente atrasos diferentes.
Crie /usr/local/bin/itmspTypeLoaderLauncher
com este conteúdo:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
Defina os dois scripts executáveis:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Defina /usr/local/bin/itmspTypeLoaderLauncher
como gancho de login :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
Reinicie para que as alterações entrem em vigor. Após o login, você deverá ver o seguinte:
e lsregister -dump
deve revelar que itmspOpener.app
é UTExportedTypeDeclarations
tem precedência sobre 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
--------------------------------------------------------
Você vê o inactive
sinalizador definido na exportação de tipo do Application Loader.app? Derrotamos o Application Loader.
As pastas acid test: .itmsp ainda são exibidas como tal após a atualização do iTunes
Atualizei recentemente o Xcode:
e pode confirmar que as pastas .itmsp foram mostradas como pastas durante a atualização:
e depois:
Uma solução parcial: o pacote mostrará o conteúdo ao clicar duas vezes
Como comentado anteriormente, o procedimento detalhado acima não funcionará com pastas arbitrárias que são exibidas como pacotes pelo Finder.
No entanto, se você quiser apenas clicar duas vezes em um pacote para abri-lo, existe uma maneira de fazê-lo com um bash
script e o Automator:
O script cria uma pasta temporária oculta dentro do pacote, a revela no Finder (revelando o pacote como uma pasta) e exclui a pasta temporária.
Nota:
O script poderia criar um arquivo temporário oculto. No entanto, prefiro criar uma pasta porque rmdir
apenas exclui pastas vazias , enquanto rm
exclui qualquer arquivo, por isso, por algum motivo. o script causa estragos, apenas pastas vazias serão excluídas, o que provavelmente não é tão ruim quanto se os arquivos fossem excluídos.
O Automator agrupa o script em um aplicativo que será associado aos arquivos do pacote.
Estas são as etapas para criar um aplicativo. Usarei arquivos .itmsp como exemplo de tipo de pacote na explicação abaixo:
Abra o Automator na pasta Aplicativos e selecione Aplicativo :
Selecione Utilitários na lista Biblioteca, selecione Executar Shell Script e arraste-o para o painel à direita:
Conjunto de entrada da passagem de como argumentos :
Substitua o conteúdo do script padrão por este:
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
Salve o aplicativo como itmspOpener:
Feche o Automator.
Agora você tem um aplicativo que pode abrir arquivos .itmsp como pastas, se associado a ele.
Há um problema estético: como está, os arquivos associados terão o ícone padrão de documento branco:
Vamos corrigir isso também:
Verifique se o Automator está fechado.
Selecione itmspOpener e mostre seu conteúdo:
Localize Conteúdo> Info.plist e abra-o com seu editor favorito:
Substitua o valor para esta chave na CFBundleDocumentTypes
matriz:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
e adicione esta chave:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Agora, a seção fica assim:
Alterne para o Finder, selecione uma pasta, pressione ⌘I, selecione o ícone da pasta no canto superior esquerdo e copie-o com ⌘C:
Abra Visualizar e selecione Arquivo> Novo na área de transferência. Salve o arquivo como folder.icns
:
Copiar folder.icns
para itmspOpener/Contents/Resources
:
Associe um arquivo .itmsp ae itmspOpener
pressione o botão Change All...:
O ícone dos arquivos .itmsp deve mudar para uma pasta, ou pelo menos pensei: infelizmente, esse não foi o caso. Então, mudei o aplicativo itmspOpener para outro local (criei uma pasta temporária na minha área de trabalho, mudei para lá e voltei para a minha área de trabalho). Isso atualizou as informações do ícone no Finder:
Agora clique duas vezes em um arquivo .itmsp e observe-o como uma pasta: