সমস্যা: .itmsp ফোল্ডারগুলি ফাইল হিসাবে দেখানো হয়
ফাইন্ডার .itmsp ফোল্ডারগুলিকে প্যাকেজ হিসাবে বিবেচনা করে, অর্থাত্ তারা একক ফাইল। উদাহরণস্বরূপ, কলাম ভিউতে .itmsp ফোল্ডারে থাকা যে কোনও কিছুই অদৃশ্য, কেবলমাত্র নথির আইকনটি দেখানো হয়েছে:
নিম্নলিখিত শর্তগুলি সত্য হলে ( বান্ডেল প্রোগ্রামিং গাইড থেকে ) অনুসন্ধানকারী ডিরেক্টরিটিকে একটি প্যাকেজ হিসাবে বিবেচনা করে :
ডিরেক্টরিটির একটি পরিচিত ফাইল নাম এক্সটেনশন রয়েছে: .app, .bundle, .Framework, .plugin, .kext, এবং আরও কিছু (যেমন সংজ্ঞায়িত করা হয়েছে /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
। এটি একটি বাইনারি প্লাস্ট, এটি এক্সকোড দিয়ে খুলুন open -a Xcode Info.plist
:)।
ডিরেক্টরিটিতে একটি এক্সটেনশান রয়েছে যা অন্য কিছু অ্যাপ্লিকেশন দাবী একটি প্যাকেজ ধরণের প্রতিনিধিত্ব করে ( এটি বের করার জন্য com.apple.package
আউটপুটটি সন্ধান করুন mdls -name kMDItemContentTypeTree <foldername>
))
ডিরেক্টরিটির প্যাকেজ বিট সেট রয়েছে (যদি GetFileInfo -ab <foldername>
ফিরে আসে 1
তবে সেট করা থাকে set)
কেস ২। আইটিএমএস ফোল্ডারে প্রযোজ্য: 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
গুরুত্বপূর্ণ তথ্য:
যদিও এটি ওপির সমস্যাটি নির্ভরযোগ্যভাবে সমাধান করে, প্রস্তাবিত সমাধানটি অন্যান্য প্যাকেজগুলিতে প্রয়োগ করা হলে সেগুলি ফোল্ডার হিসাবে প্রদর্শন করে না।
আমি খুঁজে পেয়েছি যে প্রস্তাবিত সমাধানটি কেবলমাত্র একটি প্রমিত মানের পাথের মধ্যে থাকা অ্যাপ্লিকেশন দ্বারা ঘোষিত ফাইল প্রকারের সাথে কাজ করে বলে মনে হচ্ছে।
এটি ক্ষেত্রে Application Loader.app
অবস্থিত, যা অবস্থিত /Applications/Xcode.app/Contents/Applications/
।
আপনি যদি আংশিক সমাধানে আগ্রহী হন তবে এই উত্তরটির শেষে দেখুন।
.Itmsp ফোল্ডারগুলি ফোল্ডার হিসাবে ফোল্ডার হিসাবে প্রদর্শিত করতে পরবর্তী পদক্ষেপগুলি অনুসরণ করুন:
অ্যাপ্লিকেশন ফোল্ডারে অটোমেটর খুলুন এবং অ্যাপ্লিকেশন নির্বাচন করুন :
লাইব্রেরির তালিকায় ইউটিলিটিগুলি নির্বাচন করুন, রান শেল স্ক্রিপ্টটি নির্বাচন করুন এবং ডানদিকে ফলকে টানুন:
এর সাথে ডিফল্ট স্ক্রিপ্ট সামগ্রীগুলি প্রতিস্থাপন করুন exit 0
:
অ্যাপ্লিকেশনটি itmspOpener হিসাবে সংরক্ষণ করুন:
বন্ধ
itmspOpener.app
এর সামগ্রীগুলি নির্বাচন করুন এবং দেখান:
বিষয়বস্তু> তথ্য.পিস্টের সন্ধান করুন এবং এটি আপনার প্রিয় সম্পাদক দিয়ে খুলুন:
এই বিভাগগুলিকে এতে প্রতিস্থাপন করুন 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
? থেকে অ্যাপলের ডকুমেন্টেশন : গুরুত্বপূর্ণ: আপনার কোডে সিস্টেম-সংজ্ঞায়িত UTIs ব্যবহার করার সময়, আপনি ধ্রুবক সংজ্ঞায়িত ব্যবহার করা উচিত UTCoreTypes.h
লঞ্চ সার্ভিস কাঠামোর মধ্যে যখন উপলব্ধ বদলে প্রকৃত ইউটিআই স্ট্রিং। উদাহরণস্বরূপ, "com.apple.application" এর চেয়ে kUTType অ্যাপ্লিকেশন পাস করুন। "সিস্টেম-ঘোষিত ইউনিফর্ম টাইপ আইডেন্টিফায়ারস" ইউটিআই স্ট্রিং ছাড়াও এই ধ্রুবকগুলিকে তালিকাভুক্ত করে।
একটি .itmsp ফাইল সংযুক্ত করুন itmspOpener
এবং বোতাম টিপুন Change All...:
লঞ্চ পরিষেবা ডেটাবেস পুনরায় সেট করুন:
$ lsregister -kill -r -domain local -domain system -domain user
(ওএস এক্স ১০.৮ 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"
)
লঞ্চ পরিষেবাদির ডাটাবেসটি পুনরায় সেট করা হওয়ার কারণে, এখন অনুসন্ধানক .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
ফোল্ডারের মেটাডেটা বৈশিষ্ট্যে যুক্ত করা হয়নি, এজন্য ফাইন্ডার এখনও .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
:
$ 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
অ্যাপ্লিকেশন লোডার.এপসের ধরণের রফতানিতে পতাকাটি দেখছেন? আমরা অ্যাপ্লিকেশন লোডারকে পরাজিত করেছি।
অ্যাসিড পরীক্ষা: .itmsp ফোল্ডারগুলি এখনও আইটিউনস আপডেটের পরে প্রদর্শিত হয়
আমি সম্প্রতি এক্সকোড আপডেট করেছি:
এবং এটি নিশ্চিত করতে পারে যে আপডেটের সময় .itmsp ফোল্ডারগুলি ফোল্ডার হিসাবে প্রদর্শিত হয়েছিল:
এবং পরে:
একটি আংশিক সমাধান: ডাবল ক্লিক করার পরে প্যাকেজটি সামগ্রীগুলি প্রদর্শন করবে
পূর্বে মন্তব্য হিসাবে, উপরে বর্ণিত পদ্ধতিটি ফাইন্ডার দ্বারা প্যাকেজ হিসাবে প্রদর্শিত সালিসী ফোল্ডারগুলির সাথে কাজ করবে না।
তবে আপনি যদি প্যাকেজটি খোলার জন্য ডাবল-ক্লিক করতে সক্ষম হতে চান তবে একটি bash
স্ক্রিপ্ট এবং অটোমেটরের সাহায্যে এটি করার একটি উপায় রয়েছে :
স্ক্রিপ্টটি প্যাকেজের অভ্যন্তরে একটি লুকানো, অস্থায়ী ফোল্ডার তৈরি করে, এটি ফাইন্ডারে প্রকাশ করে (এইভাবে প্যাকেজটি ফোল্ডার হিসাবে প্রকাশ করে) এবং তারপরে অস্থায়ী ফোল্ডারটি মুছে ফেলা হয়।
বিঃদ্রঃ:
স্ক্রিপ্ট পরিবর্তে একটি লুকানো, অস্থায়ী ফাইল তৈরি করতে পারে। তবে আমি কোনও ফোল্ডার তৈরি করতে পছন্দ করি কারণ rmdir
কেবল খালি ফোল্ডারগুলি rm
মুছে ফেলা হয় , যখন কোনও ফাইল মুছে ফেলা হয় , তাই যদি কোনও কারণে হয়। স্ক্রিপ্টের সর্বনাশ হয়েছে, কেবল খালি ফোল্ডারগুলি মুছে ফেলা হবে, যা সম্ভবত ফাইলগুলি মুছে ফেলা হবে তেমন খারাপ নয়।
অটোমেটর স্ক্রিপ্টটিকে এমন একটি অ্যাপ্লিকেশনে বান্ডিল করে যা প্যাকেজ ফাইলগুলির সাথে যুক্ত হবে।
এই জাতীয় অ্যাপ্লিকেশন তৈরির পদক্ষেপ। আমি নীচের ব্যাখ্যায় প্যাকেজ টাইপের উদাহরণ হিসাবে .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 ফাইলগুলি খুলতে পারে।
একটি প্রসাধনী সমস্যা আছে: এটি যেমন দাঁড়িয়ে আছে, সম্পর্কিত ফাইলগুলির স্ট্যান্ডার্ড সাদা নথির আইকন থাকবে:
আসুন এটিও ঠিক করুন:
অটোমেটারটি বন্ধ রয়েছে তা নিশ্চিত করুন।
এটিএসপোপেনার নির্বাচন করুন এবং এর সামগ্রীগুলি দেখান:
বিষয়বস্তু> তথ্য.পিস্টের সন্ধান করুন এবং এটি আপনার প্রিয় সম্পাদক দিয়ে খুলুন:
CFBundleDocumentTypes
অ্যারেতে এই কীটির মানটি প্রতিস্থাপন করুন :
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
এবং এই কী যুক্ত করুন:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
এখন, বিভাগটি এর মতো দেখাচ্ছে:
ফাইন্ডারে স্যুইচ করুন, একটি ফোল্ডার নির্বাচন করুন, টিপুন ⌘I, বাম উপরের কোণায় ফোল্ডার আইকনটি নির্বাচন করুন এবং এটি দিয়ে অনুলিপি করুন ⌘C:
পূর্বরূপ খুলুন এবং ক্লিপবোর্ড থেকে ফাইল> নতুন নির্বাচন করুন। ফাইলটি সংরক্ষণ করুন folder.icns
:
এতে অনুলিপি folder.icns
করুন itmspOpener/Contents/Resources
:
একটি .itmsp ফাইল সংযুক্ত করুন itmspOpener
এবং বোতাম টিপুন Change All...:
.Itmsp ফাইলগুলির আইকনটি কোনও ফোল্ডারে পরিবর্তিত হওয়া উচিত, বা কমপক্ষে আমি এটি ভেবেছিলাম: দুর্ভাগ্যক্রমে, এটি ছিল না। সুতরাং আমি অ্যাপ্লিকেশনটি আইএমএসস্পারকে অন্য জায়গায় সরিয়ে নিয়েছি (আমি আমার ডেস্কটপে একটি অস্থায়ী ফোল্ডার তৈরি করেছি, এটি সেখানে সরিয়ে নিয়ে আমার ডেস্কটপে ফিরে এসেছি)। এটি ফাইন্ডারে আইকন তথ্য সতেজ করে:
এখন একটি .itmsp ফাইলটিতে ডাবল ক্লিক করুন এবং এটি ফোল্ডার হিসাবে খোলা দেখুন: