2013-02-14 33 views
1

OK OS X的文件類型,所以這裏的交易:註冊新的擴展名關聯與Cocoa程序

  • 我有一個新的應用程序,我想用一個新的文件類型關聯 - 讓我們說.xyz
  • .xyz文件 - 如果有問題 - 是文件。

現在,這裏是我的info.plist的特定文件類型,部分看起來像:

CFBundleDocumentTypes = (
     { 
      CFBundleTypeExtensions = ("xyz"); 
      CFBundleTypeIconFile = "xyz-icon"; 
      CFBundleTypeName = "XYZ file"; 
      CFBundleTypeRole = "Viewer"; 
      LSTypeIsPackage = "1"; 
     } 
    ); 

然而,.xyz包文件仍顯示爲文件夾,而不是作爲一個單獨的文件(「包」) 。我究竟做錯了什麼?


提示:我已經成功地做到這一點,在過去,但我根本不記得,如果我失去了一些東西。也許系統必須重新啓動?我不知道...

+0

您實際使用的是哪種類型?您是否驗證過您沒有任何其他應用程序可以在您的系統上處理.xyz類型,並且可能會在沒有'LSTypeIsPackage'的情況下聲明它? – 2013-02-14 22:12:05

+0

@PeterHosey是的,我100%肯定。這是一個獨特的7字母擴展名,僅用於我的應用程序。 – 2013-02-15 07:09:12

回答

1

我認爲你必須設置「包位」,也稱爲「捆綁位」,以通知操作系統該文件夾是一個包。

+0

Walt,謝謝!好像我在SO中發佈了正確的代碼,但是我錯過了我原來的'info.plist'中的'LSTypeIsPackage ='1''位。有趣...大聲笑 – 2013-02-14 08:35:56

+0

如果「文件夾」具有文檔類型字典中給出的文件擴展名之一,並且同一類型字典中的「LSTypeIsPackage」鍵設置爲true,則不需要這樣做。 – 2013-02-14 22:11:06

+0

@PeterHosey我明白你的觀點。但是,添加LSTypeIsPackage *確實修復了它。所以... – 2013-02-15 07:10:50

1

如果您安裝您的應用程序,我相信您的導出類型(來自您的Info.plist)將讓系統知道您的軟件包。

雖然它在開發中,你可能需要設置沃爾特所說的「包位」的東西,如:

if !directoryURL.setResourceValue(true, forKey: NSURLIsPackageKey, error: &error) { 
     println("Soft warning: cannot set package bit for \(directoryURL)") 
    } 

因爲我不認爲搜索會看在你的開發目錄中找到新的普遍類型。

+0

「Finder」看起來無處不在,甚至在垃圾桶裏。這不是發現者,它實際上是一種名爲LaunchServices的服務。 – 2015-06-26 23:51:03

+0

是的。我看到很多LaunchServices沒有及時正確更新其緩存的情況 - 根據我的經驗,這不是確定性的,所以我不依賴它。 – 2016-01-06 23:45:20

1

您需要導出您的類型。

UTExportedTypeDeclarations = (
    { 
    UTTypeDescription = "Your File Type Description"; 
    UTTypeIconFile = "xyz-icon"; 
    UTTypeIdentifier = "your.uti.xyz" 
    UTTypeTagSpecification = { 
     public.filename-extension = ("xyz") 
    } 
    } 

免責聲明:我已經習慣了的XML plist中的語法,所以有可能在上述語法錯誤,但它應該是基本正確的結構。

0

如果您發現此計算器頁面因爲LSTypeIsPackage不適合您,可能是因爲您使用LSItemContentTypes來聲明您的文檔類型。使用LSItemContentTypes會使系統忽略LSTypeIsPackage(在這個計算器問題中不是這種情況)。

如果您使用的是LSItemContentTypes,則需要使您的導出類型符合com.apple.package。例如:

CFBundleDocumentTypes 
    LSItemContentTypes 
    Item 0 = com.example.xyz 
    CFBundleTypeExtensions 
    Item 0 = xyz 
    CFBundleTypeRole = Editor 
    etc. 

UTExportedTypeDeclarations 
    Item 0 
    UTTypeIdentifier = com.example.xyz 
    UTTypeConformsTo 
     Item 0 = public.data // or whatever 
     Item 1 = com.apple.package   <------------- 
    UTTypeDescription = XYZ Document 
    etc. 
相關問題