ย้อนกลับ Filetype Association


12

ฉันทำงานกับแพ็คเกจ iTunes Music Store เป็นครั้งคราว แพ็คเกจเหล่านี้มี.itmspนามสกุล ชอบ.app, .itmspเป็นหลักไดเรกทอรีภาชนะ .itmspโฟลเดอร์มีไฟล์ XML และไฟล์มีเดีย

Xcode ล่าสุดและ / หรือการอัปเดต Mac OS X (Xcode 4.6.1 บน Mac OS 10.8.3) ได้ทำการเชื่อมโยงประเภทไฟล์สำหรับไดเรกทอรีที่มี.itmspนามสกุล ก่อนหน้านี้พวกเขาได้รับการปฏิบัติเหมือนโฟลเดอร์ปกติ - ไม่ต้องคลิกสองครั้งเพื่อดูภายใน ตอนนี้ฉันต้องคลิกสองครั้งเพื่อโต้ตอบกับพวกเขา เมื่อฉันทำโปรแกรมที่ชื่อว่า Application Loader พยายามเปิดมัน เพื่อที่จะดูภายในฉันต้องคลิกขวาและเลือก "แสดงเนื้อหาแพ็คเกจ" ฉันกำลังจัดการกับไฟล์หลายพันไฟล์ในเวลาที่กำหนดเพื่อที่จะไม่ทำงาน

ฉันได้ลองเปลี่ยนหรือลบการเชื่อมโยงชนิดไฟล์โดยใช้ Get Info และ RCDefaultApp ไม่ทำงาน การลบการเชื่อมโยงประเภทไฟล์เพียงเปลี่ยน.itmspไดเรกทอรีเป็นไฟล์เปล่า ดังนั้นการลบแอพพลิเคชั่น Loader.app โดยสิ้นเชิง ไม่ว่าในกรณีใดฉันยังคงไม่สามารถเรียกดูเนื้อหาโดยไม่ต้องคลิกขวา

คำตอบที่ได้รับการยอมรับก่อนหน้านี้ทำงานรักษาในขณะที่: lsregister -u /Applications/Contents/Applications/Application\ Loader.app/มันหยุดทำงานตั้งแต่ฉันปรับปรุง Xcode และ / หรือ Mac OS X ได้หากคุณมีการติดตั้ง Xcode foo.itmspคุณควรจะสามารถที่จะทดสอบนี้ด้วยตัวเองโดยการตั้งชื่อไดเรกทอรี

ฉันจะทำให้.itmspไฟล์นั้นเป็นโฟลเดอร์ได้อย่างไร?


คุณได้ลองลากและวางไฟล์บนไอคอนแอป Xcode แล้วดูว่าเป็นไปตามที่คุณต้องการหรือไม่?
MrDaniel

ขอบคุณสำหรับคำแนะนำ มันไม่เกี่ยวข้องกับปัญหาที่เกิดขึ้นดังนั้นฉันจะพยายามแก้ไขคำถามของฉันเพื่อชี้แจงเจตนาของฉัน
michaelmichael

1
คุณใช้ OS X เวอร์ชันใดอยู่ Xcode รุ่นใด
โปรเก่า

ฉันลบคำตอบของฉันซึ่งลบประเภทออกจาก CFBundleDocumentTypes และฆ่าบน Launch Service DataBase มันใช้งานได้ซักพัก แต่ดูเหมือนจะยืนยันตัวเองอีกครั้งในภายหลัง
markhunte

คำตอบ:


11

ปัญหา:. itmsp โฟลเดอร์จะแสดงเป็นไฟล์

Finder ปฏิบัติต่อโฟลเดอร์. itmsp เป็นแพ็คเกจนั่นคือราวกับว่าเป็นไฟล์เดียว ตัวอย่างเช่นในมุมมองคอลัมน์สิ่งใดก็ตามที่อยู่ในโฟลเดอร์. itmsp จะมองไม่เห็นมีเพียงไอคอนเอกสารเท่านั้นที่แสดง:

ป้อนคำอธิบายรูปภาพที่นี่

Finder พิจารณาว่าไดเร็กทอรีเป็นแพ็กเกจหากเงื่อนไขใด ๆ ต่อไปนี้เป็นจริง (จากคู่มือการเขียนโปรแกรม Bundle ):

  1. ไดเรกทอรีที่มีส่วนขยายของแฟ้มที่รู้จักกัน (ตามที่กำหนดใน .app, .bundle, .framework, .plugin, .kext และอื่น ๆ/System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist. นี้เป็น plist ไบนารีเปิดกับ Xcode: open -a Xcode Info.plist)

  2. ไดเรกทอรีมีส่วนขยายที่บางแอปพลิเคชันอ้างสิทธิ์แทนประเภทแพคเกจ (ค้นหาcom.apple.packageผลลัพธ์จากmdls -name kMDItemContentTypeTree <foldername>การค้นหา)

  3. ไดเรกทอรีมีชุดบิตของแพคเกจ (หาก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เป็นโฟลเดอร์และบังคับให้บริการเปิดใช้งานเพื่อใช้การประกาศประเภทที่แก้ไข

โน๊ตสำคัญ:

แม้ว่ามันจะแก้ปัญหาของ OP ได้อย่างน่าเชื่อถือ แต่โซลูชันที่นำเสนอเมื่อนำไปใช้กับแพ็คเกจอื่น ๆ ไม่ได้แสดงเป็นโฟลเดอร์

ฉันพบว่าโซลูชันที่เสนอนั้นดูเหมือนว่าจะทำงานกับประเภทไฟล์ที่ประกาศโดยแอปพลิเคชันที่อยู่ในพา ธ แอปพลิเคชันที่ไม่เป็นมาตรฐานเท่านั้น

นี้เป็นกรณีที่มีที่ตั้งอยู่ในApplication Loader.app/Applications/Xcode.app/Contents/Applications/

หากคุณมีความสนใจในการแก้ปัญหาบางส่วนตรวจสอบจุดสิ้นสุดของคำตอบนี้

หากต้องการให้โฟลเดอร์. itmsp แสดงเป็นโฟลเดอร์โดย Finder ให้ทำตามขั้นตอนถัดไป:

  1. เปิด Automator ในโฟลเดอร์ Applications และเลือกApplication :

    ป้อนคำอธิบายรูปภาพที่นี่

  2. เลือกโปรแกรมอรรถประโยชน์ในรายการไลบรารีเลือกเรียกใช้ Shell Script และลากไปยังบานหน้าต่างด้านขวา:

    ป้อนคำอธิบายรูปภาพที่นี่

  3. แทนที่เนื้อหาสคริปต์เริ่มต้นด้วยexit 0:

    ป้อนคำอธิบายรูปภาพที่นี่

  4. บันทึกแอปพลิเคชันเป็น itmspOpener:

    ป้อนคำอธิบายรูปภาพที่นี่

  5. ปิด Automator

  6. เลือกitmspOpener.appและแสดงเนื้อหา:

    ป้อนคำอธิบายรูปภาพที่นี่

  7. ค้นหาเนื้อหา> Info.plist และเปิดด้วยเครื่องมือแก้ไขที่คุณชื่นชอบ:

    ป้อนคำอธิบายรูปภาพที่นี่

  8. แทนที่ส่วนเหล่านี้ใน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? จากเอกสารของ Apple : สำคัญ: เมื่อใช้ UTIs ที่ระบบกำหนดในรหัสของคุณคุณควรใช้ค่าคงที่ที่กำหนดในUTCoreTypes.hเฟรมเวิร์ก Launch Services เมื่อพร้อมใช้งานแทนที่จะใช้สตริง UTI จริง ตัวอย่างเช่นส่งผ่าน kUTTypeApplication แทนที่จะเป็น "com.apple.application" “ ตัวระบุประเภทเครื่องแบบแบบระบบประกาศ” แสดงรายการค่าคงที่เหล่านี้เพิ่มเติมจากสตริง UTI

  9. เชื่อมโยงไฟล์. itmsp กับitmspOpenerและกดปุ่มChange All...:

    ป้อนคำอธิบายรูปภาพที่นี่

  10. รีเซ็ตฐานข้อมูล 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/)

  11. สร้างโฟลเดอร์. itmsp และแสดงรายการคุณสมบัติ:

    $ mkdir foo3.itmsp
    $ mdls -name kMDItemContentTypeTree foo3.itmsp/
    kMDItemContentTypeTree = (
        "public.folder",
        "public.directory",
        "public.item"
    )
    

    เนื่องจากฐานข้อมูล Launch Services ถูกรีเซ็ตตอนนี้ Finder จะแสดงโฟลเดอร์. itmsp เป็นโฟลเดอร์

  12. เปิดitmspOpener.appเพื่อโหลดไฟล์ plist และลงทะเบียนcom.apple.itunes-producer.itmsp:

    $ open ~/Desktop/itmspOpener.app
    
  13. เริ่มApplication Loader.app:

    $ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
    

    โฟลเดอร์foo3.itmspควรจะยังคงแสดงเป็นโฟลเดอร์

  14. ตรวจสอบคุณสมบัติของโฟลเดอร์อีกครั้ง:

    $ mdls -name kMDItemContentTypeTree foo3.itmsp/
    kMDItemContentTypeTree = (
        "public.directory",
        "public.item",
        "public.content"
    )
    

    com.apple.package ไม่ได้ถูกเพิ่มไปยังแอตทริบิวต์ข้อมูลเมตาของโฟลเดอร์นั่นคือสาเหตุที่ Finder ยังคงแสดงโฟลเดอร์. itmsp เป็นโฟลเดอร์!

โซลูชันอัตโนมัติ: แสดงโฟลเดอร์. itmsp เป็นโฟลเดอร์หลังจากเข้าสู่ระบบ

ในการแสดงโฟลเดอร์. itmsp เป็นโฟลเดอร์หลังจากเข้าสู่ระบบ:

  1. สร้างitmspOpener.appและแก้ไขInfo.plistตามที่อธิบายไว้ข้างต้น

  2. สร้าง/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มีความสำคัญสูงสุด หากคุณไม่เห็นผลลัพธ์ที่ต้องการลองความล่าช้าที่แตกต่างกัน

  3. สร้าง/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 &
    
  4. ตั้งค่าสคริปต์ทั้งสองให้ทำงานได้:

    $ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher 
    
  5. ตั้ง/usr/local/bin/itmspTypeLoaderLauncherเป็นเบ็ดเข้าสู่ระบบ :

    $ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
    
  6. รีบูตเพื่อให้การเปลี่ยนแปลงมีผล หลังจากเข้าสู่ระบบคุณจะเห็นสิ่งนี้:

    ป้อนคำอธิบายรูปภาพที่นี่

    และ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ตั้งค่าสถานะในการส่งออกชนิดของ Application Loader.app หรือไม่ เราพ่ายแพ้ Application Loader

การทดสอบกรด:. itmsp โฟลเดอร์ยังคงแสดงเช่นนี้หลังจากการปรับปรุง iTunes

ฉันเพิ่งอัปเดต Xcode:

ป้อนคำอธิบายรูปภาพที่นี่

และสามารถยืนยันได้ว่าโฟลเดอร์. itmsp ถูกแสดงเป็นโฟลเดอร์ในระหว่างการอัพเดท:

ป้อนคำอธิบายรูปภาพที่นี่

และหลังจากนั้น:

ป้อนคำอธิบายรูปภาพที่นี่

โซลูชันบางส่วน: แพ็คเกจจะแสดงเนื้อหาเมื่อดับเบิลคลิก

ตามที่แสดงความคิดเห็นก่อนหน้านี้ขั้นตอนรายละเอียดด้านบนจะไม่ทำงานกับโฟลเดอร์ที่กำหนดเองซึ่งแสดงเป็นแพ็คเกจโดย Finder

อย่างไรก็ตามหากคุณต้องการให้คลิกสองครั้งที่แพคเกจเพื่อเปิดมันมีวิธีที่จะทำมันด้วยหนึ่งbashสคริปต์และ Automator:

  • สคริปต์จะสร้างโฟลเดอร์ชั่วคราวที่ซ่อนอยู่ภายในแพ็คเกจแสดงใน Finder (ซึ่งจะแสดงให้เห็นว่าเป็นแพคเกจโฟลเดอร์) จากนั้นลบโฟลเดอร์ชั่วคราว

    บันทึก:

    สคริปต์สามารถสร้างไฟล์ชั่วคราวที่ซ่อนอยู่แทน อย่างไรก็ตามฉันต้องการสร้างโฟลเดอร์เพราะrmdirจะลบเฉพาะโฟลเดอร์เปล่าในขณะที่rmลบไฟล์ใด ๆดังนั้นถ้าด้วยเหตุผลบางประการ สคริปต์สร้างความเสียหายเฉพาะโฟลเดอร์ที่ว่างเปล่าเท่านั้นที่จะถูกลบซึ่งอาจไม่เลวเท่าที่ลบไฟล์

  • Automator รวมสคริปต์เข้าไปในแอปพลิเคชันที่จะเชื่อมโยงกับไฟล์แพ็กเกจ

เหล่านี้เป็นขั้นตอนในการสร้างแอปพลิเคชันดังกล่าว ฉันจะใช้ไฟล์. itmsp เป็นตัวอย่างประเภทแพ็คเกจในคำอธิบายด้านล่าง:

  1. เปิด Automator ในโฟลเดอร์ Applications และเลือกApplication :

    ป้อนคำอธิบายรูปภาพที่นี่

  2. เลือกโปรแกรมอรรถประโยชน์ในรายการไลบรารีเลือกเรียกใช้ Shell Scriptและลากไปยังบานหน้าต่างด้านขวา:

    ป้อนคำอธิบายรูปภาพที่นี่

  3. ตั้งค่าการป้อนข้อมูลผ่านไปเป็นข้อโต้แย้ง :

    ป้อนคำอธิบายรูปภาพที่นี่

  4. แทนที่เนื้อหาสคริปต์เริ่มต้นด้วยสิ่งนี้:

    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
    
  5. บันทึกแอปพลิเคชันเป็น itmspOpener:

    ป้อนคำอธิบายรูปภาพที่นี่

  6. ปิด Automator

ตอนนี้คุณมีแอปพลิเคชั่นที่สามารถเปิดไฟล์. itmsp เป็นโฟลเดอร์หากเชื่อมโยงกับมัน

มีปัญหาเกี่ยวกับเครื่องสำอางเนื่องจากไฟล์ที่เกี่ยวข้องจะมีไอคอนเอกสารสีขาวมาตรฐาน:

ป้อนคำอธิบายรูปภาพที่นี่

มาแก้ไขกันเถอะ:

  1. ตรวจสอบให้แน่ใจว่าปิดอัตโนมัติแล้ว

  2. เลือก itmspOpener และแสดงเนื้อหา:

    ป้อนคำอธิบายรูปภาพที่นี่

  3. ค้นหาเนื้อหา> Info.plist และเปิดด้วยเครื่องมือแก้ไขที่คุณชื่นชอบ:

    ป้อนคำอธิบายรูปภาพที่นี่

  4. แทนที่ค่าสำหรับคีย์นี้ในCFBundleDocumentTypesอาร์เรย์:

    <key>CFBundleTypeName</key>
    <string>itmsp folder</string>
    

    และเพิ่มคีย์นี้:

    <key>CFBundleTypeIconFile</key>
    <string>folder</string>
    

    ตอนนี้หัวข้อจะเป็นดังนี้:

    ป้อนคำอธิบายรูปภาพที่นี่

  5. สลับไปที่ Finder เลือกโฟลเดอร์กดIเลือกไอคอนโฟลเดอร์ที่มุมบนซ้ายและคัดลอกด้วยC:

    ป้อนคำอธิบายรูปภาพที่นี่

  6. เปิดดูตัวอย่างและเลือกไฟล์> ใหม่จากคลิปบอร์ด บันทึกไฟล์เป็นfolder.icns:

    ป้อนคำอธิบายรูปภาพที่นี่

  7. คัดลอกfolder.icnsไปที่itmspOpener/Contents/Resources:

    ป้อนคำอธิบายรูปภาพที่นี่

  8. เชื่อมโยงไฟล์. itmsp กับitmspOpenerและกดปุ่มChange All...:

    ป้อนคำอธิบายรูปภาพที่นี่

ไอคอนของไฟล์. itmsp ควรเปลี่ยนเป็นโฟลเดอร์หรืออย่างน้อยฉันก็คิดอย่างนั้นโชคไม่ดีในกรณีนี้ ดังนั้นฉันจึงย้ายแอปพลิเคชัน itmspOpener ไปยังตำแหน่งอื่น (ฉันสร้างโฟลเดอร์ชั่วคราวบนเดสก์ท็อปของฉันย้ายไปที่นั่นแล้วกลับไปที่เดสก์ท็อปของฉัน) ที่รีเฟรชข้อมูลไอคอนใน Finder:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ดับเบิลคลิกที่ไฟล์. itmsp และเปิดดูเป็นโฟลเดอร์:

ป้อนคำอธิบายรูปภาพที่นี่


สิ่งนี้น่าประทับใจมาก ... แต่ดูเหมือนว่าจะมีปัญหาหนึ่งที่ทำให้งุนงง: หาก Finder อยู่ในมุมมองคอลัมน์ (ประเภทมุมมองที่ฉันต้องการ) ทุกสิ่งที่อยู่ใน.itmspโฟลเดอร์จะมองไม่เห็น ฉันไม่สามารถแยกแยะว่าทำไม แต่มีอยู่ด้วย นอกจากนี้หากฉันมี druthers ของฉันคุณไม่ต้องคลิกสองครั้งที่ไฟล์เพื่อดูข้างใน แต่ก็ดี
michaelmichael

1
คุณพูดถูก ฉันไม่ได้คาดหวังว่าคุณจะใช้มุมมองคอลัมน์แม้ว่าฉันต้องบอกว่าเหมาะสมมากเมื่อจัดการกับโฟลเดอร์. itmsp หลายพันรายการ แต่ฉันพบวิธีแก้ปัญหานั่นคือบังคับให้ Finder ทำการรักษาโฟลเดอร์. itmsp เป็นโฟลเดอร์ ลองดูที่การแก้ไขของฉัน (หรือข้ามไปยังย่อหน้าสุดท้ายที่เรียกว่าการแก้ปัญหา แต่อย่าลืมแก้ไขข้อมูล Info.plist ของ itmspOpener ก่อนตามที่อธิบายไว้ในวรรคเคล็ดลับ)
jaume

เหลือเชื่อ! ขอบคุณสำหรับคำตอบ. นี่เป็นภาพที่น่าสนใจมากในบางสิ่งที่ทำให้ Finder และ OS X ทำเครื่องหมาย
michaelmichael

ขอบคุณฉันดีใจที่คุณพบว่ามีประโยชน์! (ฉันจะแก้ไขคำตอบในภายหลังเพื่อปรับปรุง readibility และให้มันโครงสร้างเพิ่มเติม.)
Jaume

ในที่สุดฉันก็หาเวลาแก้ไขคำตอบ ฉันได้เรียงลำดับย่อหน้าใหม่และมีหลักฐานเพิ่มเติมว่าวิธีการแก้ปัญหาที่อธิบายไว้ในคำตอบของฉันมีผลต่อการอัพเดท iTunes
Jaume

7

ทางเลือกหนึ่งคือยกเลิกการลงทะเบียน Application Loader ด้วยlsregister -u /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/แต่จะถูกลงทะเบียนอีกครั้งหากเปิดถ้าฐานข้อมูล Launch Services ถูกสร้างขึ้นมาใหม่หรืออาจเป็นไปได้ว่าหาก Xcode ได้รับการอัพเดต

นอกจากนี้คุณยังสามารถแสดงความคิดเห็นออกรายการใน CFBundleDocumentTypes และ UTExportedTypeDeclarations พจนานุกรมในและเรียกใช้/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Info.plist lsregister -f /Applications/Xcode.app/Contents/Applications/Utilities/Application\ Loader.app/มันไม่ได้ทำให้ลายเซ็นต์ของ Xcode เป็นโมฆะ แต่การเปลี่ยนแปลงอาจถูกเขียนทับโดยการอัพเดท

เส้นทางแบบเต็มไปยัง lsregister อยู่/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregisterใน 10.5 และใหม่กว่า


คุณแน่ใจหรือไม่ว่าการยกเลิกการลงทะเบียนแอพหลังจากเปลี่ยนInfo.plistจะเป็นการยกเลิกการลงทะเบียนประเภทไฟล์ที่คุณลบออกจาก Plist ฉันสามารถจินตนาการว่ามันใช้งานได้และฉันสามารถจินตนาการได้ว่ามันล้มเหลว เกินไป.
โปรเก่า

@OldPro ใช่lsregister -u $app && lsregister $appดูเหมือนจะนำการเปลี่ยนแปลงไปใช้กับ Info.plist อย่างน้อยในกรณีนี้
Lri

นี่เป็นคำตอบที่ยอดเยี่ยม - โปรดจำไว้ว่าในครั้งต่อไปที่คุณอัปเกรด Xcode - คุณอาจจบลงด้วย Application Loader ที่ลงทะเบียนเริ่มต้นCFBundleDocumentTypesดังนั้นคุณอาจลบ "เครื่องมือ" นั้นเมื่อมันปรากฏขึ้นหากคุณไม่ต้องการมันและ / หรือยางของการดัดแปลง
bmike

2

นี่คือข้อความที่ตัดตอนมาจากdocumenationของ Apple เกี่ยวกับการรวมกลุ่ม ( เน้นเพิ่ม )

วิธีที่ระบบระบุการรวมกลุ่มและแพ็คเกจ

Finder พิจารณาว่าไดเร็กทอรีเป็นแพ็กเกจหากเงื่อนไขใด ๆ ต่อไปนี้เป็นจริง:

  • ไดเรกทอรีนี้มีนามสกุลไฟล์ที่รู้จัก: .app, .bundle, .framework, .plugin, .kext และอื่น ๆ
  • ไดเรกทอรีมีส่วนขยายที่บางแอปพลิเคชันอ้างสิทธิ์แสดงถึงประเภทแพคเกจ ดู“ ชุดเอกสาร
  • ไดเรกทอรีมีการตั้งค่าแพคเกจบิต

วิธีที่ต้องการเพื่อระบุแพ็กเกจคือการให้นามสกุลไฟล์เป็นที่รู้จักในไดเรกทอรีแพ็คเกจ ส่วนใหญ่ Xcode จะดูแลสิ่งนี้ให้คุณโดยการให้แม่แบบที่ใช้ส่วนขยายที่ถูกต้อง สิ่งที่คุณต้องทำคือสร้างโครงการ Xcode ประเภทที่เหมาะสม

เกือบจะแน่นอน Xcode เป็นตัวแทนที่อ้างว่า.itmspเป็นตัวแทนของประเภทแพคเกจตามที่อธิบายไว้ในแพคเกจเอกสาร ดังนั้นบางทีการลบส่วนขยายนั้นออกจาก Xcode Info.plistจะทำเคล็ดลับ แต่ฉันสงสัยว่าเมื่อ Finder ได้รับการเชื่อมโยงจาก Finder แล้วการลบออกจาก Xcode จะไม่ยกเลิก "แอปพลิเคชันที่แนะนำ" ที่คุณได้รับเมื่อคุณคลิกขวาที่ "เปิดด้วย ... " คืออะไร คุณต้องตรวจสอบ Info.plists ทั้งหมดของพวกเขา

ฉันขอแนะนำให้ดูว่าคุณสามารถใช้lsregister -uเพื่อยกเลิกการลงทะเบียนแอพที่อ้างสิทธิ์.itmspได้หรือไม่ มิฉะนั้นคุณอาจจะต้องลบ.itmspจาก plists lsregister -kill -seedทั้งหมดแล้วฆ่าค้นหาสมาคมทั้งฐานข้อมูลโดยใช้ ไม่เคยทำเช่นนั้นโดยไม่บอกว่าความเสียหายที่เกิดขึ้นกับระบบของคุณจะเป็นอย่างไร อาจเป็นไปได้ว่าคุณต้องการยกเลิกการลงทะเบียนแล้วแก้ไข plists จากนั้น kill และ reseed ฐานข้อมูลอีกครั้ง จะไม่ทำให้ฉันประหลาดใจหากการถอนการลงทะเบียนไม่ได้ลบการเชื่อมโยงหากคุณได้ลบออกจากการวางแผนเรียบร้อยแล้วและการส่งประวัติจะเพิ่มเข้าไปใหม่หากคุณยังไม่ได้ลบออก รวมทั้งวิธีนี้คุณจะไม่สูญเสียการเชื่อมโยงอื่น ๆ ทั้งหมดสำหรับแอพที่ละเมิด

ยิ่งไปกว่านั้น Xcode ยังสามารถผ่านและกำหนดบันเดิลบิตในโฟลเดอร์ทั้งหมดได้ ฉันเดาว่าคุณจะต้องเขียนสคริปต์โดยใช้GetFileInfoและSetFileเพื่อสแกนดิสก์และเลิกทำสิ่งเหล่านั้นซึ่งเป็นความเจ็บปวด แต่ทำได้ นิ้วมือข้ามบิตมัดยังคงไม่ได้รับการตั้งค่า ใช้GetFileInfoเพื่อตรวจสอบโดยการทดสอบไม่กี่


0

ฉันเชื่อว่าคุณสามารถแก้ไขได้โดยใช้

/usr/bin/SetFile -a B /path/to/file.itmsp

ทดสอบหนึ่งก่อนที่คุณจะลองกับคนอื่นทั้งหมดอย่างเห็นได้ชัด

หากคุณต้องการให้มันทำงานกับมันทั้งหมดในโฟลเดอร์ที่กำหนด:

find . -name \*.itmsp -exec /usr/bin/SetFile -a B {} \;

ควรทำเพื่อคุณ


1
SetFile -a B ตั้งค่าบันเดิลบิต ที่จริงแล้วควรปิดการใช้งาน: SetFile -a b. แต่นี้จะไม่ได้มีผลตั้งแต่Has bundleบิตไม่ได้ตั้ง: ผลตอบแทนGetFileInfo -ab foo.itmsp 0
jaume
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.