문제 : .itmsp 폴더가 파일로 표시됩니다
Finder는 .itmsp 폴더를 패키지 (즉, 단일 파일 인 것처럼) 로 취급 합니다. 예를 들어 열보기에서 .itmsp 폴더에 포함 된 내용은 보이지 않으며 문서 아이콘 만 표시됩니다.
Finder는 번들 프로그래밍 안내서 에서 다음 조건 중 하나에 해당하는 경우 디렉토리를 패키지로 간주합니다 .
디렉토리의 알려진 파일 이름 확장자는 .app, .bundle, .framework, .plugin, .kext 등입니다 ( /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
.에 정의되어 있음) . 이진 plist이므로 Xcode로 엽니 다 ( open -a Xcode Info.plist
).
디렉토리에는 일부 다른 응용 프로그램 청구가 패키지 유형을 나타내는 확장자가 있습니다 ( com.apple.package
출력 결과 mdls -name kMDItemContentTypeTree <foldername>
에서 찾으십시오).
디렉토리에 패키지 비트 세트가 있습니다 (을 GetFileInfo -ab <foldername>
리턴 1
하면 설정 됨).
사례 2. .itmsp 폴더에 적용 : Application Loader.app
유형을 내보내고 com.apple.itunes-producer.itmsp
다음을 준수하도록 설정합니다 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>
해결책 : 유형을 다시 선언 com.apple.itunes-producer.itmsp
해결책은 형식 com.apple.itunes-producer.itmsp
과 확장명 itmsp
을 폴더 로 다시 선언 하고 Launch Services가 수정 된 형식 선언을 사용하도록하는 것입니다.
중요 사항:
OP의 문제를 안정적으로 해결하지만 제안 된 솔루션은 다른 패키지에 적용될 때 폴더로 표시하지 않습니다.
제안 된 솔루션이 비표준 응용 프로그램 경로에있는 응용 프로그램에서 선언 한 파일 형식에서만 작동하는 것으로 나타났습니다.
이것은의 경우 Application Loader.app
에 위치하고 있습니다 /Applications/Xcode.app/Contents/Applications/
.
부분 솔루션에 관심이 있다면이 답변의 끝을 확인하십시오.
Finder에서 .itmsp 폴더를 폴더로 표시하려면 다음 단계를 수행하십시오.
열기 자동화 응용 프로그램 폴더 선택에서 응용 프로그램 :
라이브러리 목록에서 유틸리티를 선택하고 쉘 스크립트 실행을 선택한 후 오른쪽 분할 창으로 끄십시오.
기본 스크립트 내용을 exit 0
다음 으로 바꾸십시오 .
itmspOpener로 애플리케이션을 저장하십시오.
오토메이터를 닫습니다.
itmspOpener.app
내용을 선택 하고 표시 하십시오 .
Contents> Info.plist를 찾아서 좋아하는 편집기로여십시오.
다음에서이 섹션을 교체하십시오 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>
참고 :
왜 kUTTypeDirectory
대신 public.directory
에 UTExportedTypeDeclarations
? 에서 애플의 설명서 : 중요 : 코드에서 시스템 정의 요로 감염을 사용하는 경우에 정의 된 상수 사용해야 UTCoreTypes.h
사용할 수있는 실행 서비스 프레임 워크보다는 실제 UTI 문자열을. 예를 들어“com.apple.application”대신 kUTTypeApplication을 전달하십시오. “System-Declared Uniform Type Identifiers”에는 UTI 문자열 외에도 이러한 상수가 나열되어 있습니다.
.itmsp 파일을 연결 itmspOpener
하고 버튼을 누릅니다 Change All...:
Launch Services 데이터베이스를 재설정하십시오.
$ lsregister -kill -r -domain local -domain system -domain user
(OS X 10.8 lsregister
에서는에 있습니다 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
.)
.itmsp 폴더를 작성하고 해당 특성을 나열하십시오.
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Launch Services 데이터베이스가 재설정되었으므로 이제 Finder는 .itmsp 폴더를 폴더로 표시합니다.
itmspOpener.app
plist 파일을로드하고 등록하려면 엽니 다 com.apple.itunes-producer.itmsp
.
$ open ~/Desktop/itmspOpener.app
시작 Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
폴더 foo3.itmsp
는 여전히 폴더 로 표시되어야합니다.
폴더 속성을 다시 확인하십시오.
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
폴더의 메타 데이터 속성에 추가되지 않았기 때문에 Finder는 여전히 .itmsp 폴더를 폴더로 표시합니다!
자동화 된 솔루션 : 로그인 후 .itmsp 폴더를 폴더로 표시
로그인 후 .itmsp 폴더를 폴더로 표시하려면 :
위에서 설명한대로 작성 itmspOpener.app
하고 수정 하십시오 Info.plist
.
/usr/local/bin/itmspTypeLoader
이 내용으로 작성하십시오 (변수 는 상주 itmspOpener
하는 위치를 가리키고 itmspOpener.app
필요에 따라 변경하십시오).
#!/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
sleep 15
달리기 전과 후에 모두 lsregister
가장 중요합니다. 원하는 결과가 보이지 않으면 다른 지연을 시도하십시오.
/usr/local/bin/itmspTypeLoaderLauncher
이 내용으로 작성하십시오 .
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
두 스크립트를 실행 파일로 설정하십시오.
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
설정 /usr/local/bin/itmspTypeLoaderLauncher
으로 로그인 후크 :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
변경 사항을 적용하려면 재부팅하십시오. 로그인 후 다음을 볼 수 있습니다 :
하고 lsregister -dump
있음을 공개한다 itmspOpener.app
의 것은 UTExportedTypeDeclarations
보다 우선 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
--------------------------------------------------------
당신은 볼 수 있나요 inactive
응용 프로그램 Loader.app의 형태 수출 플래그가 설정? 우리는 Application Loader를 물리 쳤다.
산성 테스트 : iTunes 업데이트 후에도 .itmsp 폴더가 계속 표시됩니다
최근에 Xcode를 업데이트했습니다.
업데이트 중에 .itmsp 폴더가 폴더로 표시되었는지 확인할 수 있습니다.
그 후 :
부분 솔루션 : 더블 클릭하면 패키지에 내용이 표시됩니다
앞에서 언급했듯이 위에서 설명한 절차는 Finder에서 패키지로 표시되는 임의의 폴더에서는 작동하지 않습니다.
그러나 패키지를 두 번 클릭하여 열려면 하나의 bash
스크립트와 Automator 로 패키지를 수행하는 방법이 있습니다 .
이러한 응용 프로그램을 만드는 단계는 다음과 같습니다. 아래 설명에서 .itmsp 파일을 패키지 유형 예제로 사용합니다.
열기 자동화 응용 프로그램 폴더 선택에서 응용 프로그램 :
라이브러리 목록에서 유틸리티 를 선택 하고 쉘 스크립트 실행을 선택한 후 오른쪽 분할 창으로 끄십시오.
패스 입력 을 인수로 설정하십시오 .
기본 스크립트 내용을 다음으로 바꾸십시오.
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
itmspOpener로 애플리케이션을 저장하십시오.
오토메이터를 닫습니다.
이제 .itmsp 파일을 관련 폴더로 열 수있는 응용 프로그램이 있습니다.
외관상의 문제가 있습니다. 관련 파일에는 표준 흰색 문서 아이콘이 있습니다.
이것도 고치자 :
Automator가 닫혀 있는지 확인하십시오.
itmspOpener를 선택하고 내용을 표시하십시오.
Contents> Info.plist를 찾아서 좋아하는 편집기로여십시오.
CFBundleDocumentTypes
배열 에서이 키의 값을 바꾸십시오 .
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
이 키를 추가하십시오.
<key>CFBundleTypeIconFile</key>
<string>folder</string>
이제 섹션은 다음과 같습니다.
Finder로 전환하고 폴더를 선택한 다음 ⌘I을 누르고 왼쪽 상단에서 폴더 아이콘을 선택하고 다음으로 복사하십시오 ⌘C.
미리보기를 열고 클립 보드에서 파일> 새로 만들기를 선택하십시오. 파일을 folder.icns
다음 과 같이 저장하십시오 .
복사 folder.icns
하기 itmspOpener/Contents/Resources
:
.itmsp 파일을 연결 itmspOpener
하고 버튼을 누릅니다 Change All...:
.itmsp 파일의 아이콘이 폴더로 변경되어야합니다. 또는 적어도 그렇게 생각했습니다. 불행히도, 그렇지 않습니다. 그래서 응용 프로그램 itmspOpener를 다른 위치로 옮겼습니다 (데스크톱에 임시 폴더를 만들고 거기로 옮긴 다음 다시 데스크탑으로 옮겼습니다). Finder의 아이콘 정보가 새로 고쳐졌습니다.
이제 .itmsp 파일을 두 번 클릭하여 폴더로 열리는 지 확인하십시오.