应用程序未显示在“打开方式”菜单中,表示支持的文档类型

时间:2014-05-07 03:18:25

标签: objective-c macos cocoa finder uti

我已经定义了我的应用支持的UTI,并可以将它们拖到Dock图标上。我还实现了-application:openFiles:和-application:openFile:在我的app委托中。但是当我获得我支持的UTI项目的信息时,它不会显示在列表中,当我浏览到"其他"时会显示为灰色。我从下面的plist粘贴了一个样本UTI。我能做错什么?我特别希望它能够与内置的App Store集成一起使用。

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>cbz</string>
        </array>
        <key>CFBundleTypeIconFile</key>
        <string>CBZ</string>
        <key>CFBundleTypeName</key>
        <string>Comic Book Zip Archive</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.abbey-code.cbz-archive</string>
        </array>
    </dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.zip-archive</string>
            <string>public.data</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Comic Book Zip Archive</string>
        <key>UTTypeIconFile</key>
        <string>CBZ</string>
        <key>UTTypeIdentifier</key>
        <string>com.abbey-code.cbz-archive</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>cbz</string>
            </array>
        </dict>
    </dict>
</array>

更新

我启动了一个没有我自己安装的第三方应用程序的虚拟机,一切都按预期工作。我重建了我的LaunchServices数据库,如下所示:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.fra‌​mework/Support/lsregister -kill -r -domain local -domain system -domain user ; killall Dock

这没有任何区别。然后我使用此命令转储LaunchServices数据库,其下方的应用程序包的结果。这看起来很合理,但我不确定我在寻找什么。我是否有可能遇到与我系统上其他应用程序发生某种冲突的情况?如果是这样,我该如何解决?

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.fra‌​mework/Support/lsregister -dump >>lsregister.txt

转储:

bundle  id:            61808
    path:          /Applications/AppName.app
    name:          AppName
    category:      public.app-category.entertainment
    identifier:    com.abbey-code.AppName (0x800183e0)
    canonical id:  com.abbey-code.appName (0x8001a08d)
    version:       6433.0
    mod date:      5/6/2014 22:54:46
    reg date:      5/7/2014 9:04:25
    type code:     'APPL'
    creator code:  '????'
    sys version:   10.9
    exec sdk ver:  10.9
    exec os ver:   10.9
    flags:         relative-icon-path  
    item flags:    container  package  application  extension-hidden  native-app  x86_64  
    hi res:        is-capabile  is-explicit  user-can-change  
    app nap:       is-capabile  
    icon:          Contents/Resources/AppIcon.icns
    executable:    Contents/MacOS/AppName
    inode:         37029967
    exec inode:    37030002
    container id:  32
    library:       Contents/Library/
    library items: QuickLook/AppNameQL.qlgenerator/
    --------------------------------------------------------
    type    id:            46888
        bindableKey:   3266
        generation:    7459
        uti:           com.abbey-code.cbz-archive
        description:   Comic Book Zip Archive
        flags:         exported  active  trusted  
        icon:          Contents/Resources/CBZ.icns
        conforms to:   public.zip-archive, public.data
        tags:          .cbz
    --------------------------------------------------------
    type    id:            46932
        bindableKey:   3267
        generation:    7459
        uti:           com.abbey-code.cbr-archive
        description:   Comic Book RAR Archive
        flags:         exported  active  trusted  
        icon:          Contents/Resources/CBR.icns
        conforms to:   public.archive, public.data
        tags:          .cbr
    --------------------------------------------------------
    claim   id:            37936
        bindableKey:   3268
        generation:    7459
        name:          Comic Book Zip Archive
        rank:          Owner
        roles:         Editor  
        flags:         relative-icon-path  
        icon:          Contents/Resources/CBZ.icns
        bindings:      com.abbey-code.cbz-archive
    --------------------------------------------------------
    claim   id:            37972
        bindableKey:   3269
        generation:    7459
        name:          Comic Book RAR Archive
        rank:          Owner
        roles:         Editor  
        flags:         relative-icon-path  
        icon:          Contents/Resources/CBR.icns
        bindings:      com.abbey-code.cbr-archive
    --------------------------------------------------------
    claim   id:            38008
        bindableKey:   3270
        generation:    1
        name:          PDF Document
        rank:          Default
        roles:         Viewer  
        flags:         
        icon:          
        bindings:      .pdf
    --------------------------------------------------------
    claim   id:            38044
        bindableKey:   3271
        generation:    1
        name:          RAR Archive
        rank:          Default
        roles:         Viewer  
        flags:         
        icon:          
        bindings:      .rar
    --------------------------------------------------------
    claim   id:            38080
        bindableKey:   3272
        generation:    1
        name:          ZIP Archive
        rank:          Default
        roles:         Editor  
        flags:         
        icon:          
        bindings:      .zip
    --------------------------------------------------------
    claim   id:            38116
        bindableKey:   3273
        generation:    7459
        name:          
        rank:          Default
        roles:         QLGenerator  
        flags:         
        icon:          
        delegate:      QuickLook/AppNameQL.qlgenerator/
        bindings:      com.abbey-code.cbz-archive, com.abbey-code.cbr-archive

1 个答案:

答案 0 :(得分:1)

您可以将应用程序设置为默认情况下为代码中的特定文档类型启动的应用程序。我发现在某些情况下,在info.plist中设置链接是不够的,这是必要的。 这通常是在你app控制器的+ initialize方法中:

    //First Check if our app is the default application to open .cbz files
NSString *cbzUTI = (NSString *)CFBridgingRelease(UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,
                                                                                          (CFStringRef)@"cbz",
                                                                                          NULL));
NSString *currentCbzApp = (NSString *)CFBridgingRelease(LSCopyDefaultRoleHandlerForContentType((__bridge CFStringRef)cbzUTI, kLSRolesAll));

if ([currentCbzApp caseInsensitiveCompare:@"com.abbey-code.AppName"] != NSOrderedSame) {
    //If not, then first register it in Launch Services
    LSRegisterURL((__bridge CFURLRef)[[NSBundle mainBundle] executableURL], YES);
    //Second set it as the default handler for the file type
    LSSetDefaultRoleHandlerForContentType((__bridge CFStringRef)cbzUTI, kLSRolesAll,(__bridge CFStringRef) [[NSBundle mainBundle] bundleIdentifier]);
}