【问题标题】:App not showing up in "Open With" menu for supported document type应用程序未显示在支持文档类型的“打开方式”菜单中
【发布时间】:2014-05-07 03:18:24
【问题描述】:

我已经定义了我的应用支持的 UTI,并且可以将它们拖到 Dock 图标上。我还在我的应用程序委托中实现了 -application:openFiles: 和 -application:openFile: 。但是,当我获得有关我支持的 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

【问题讨论】:

  • 您是否创建了可执行文件并将其复制到 Finder?有时需要上下跳跃、挥手和秘密咒语才能让 Finder 注册新应用程序的类型。但是,通常将其复制到桌面就可以了..
  • @cacau 我没有尝试过桌面,但我已经将它安装在Applications 目录中并从那里运行它。最让我困扰的是,即使我在“其他...”窗口中浏览,它也显示为灰色。
  • 要尝试的一件事是重建启动服务数据库,它可能只是碰巧搞砸了或为您的应用保留了旧的/不正确的值。
  • @cacau 不。重建启动服务数据库并没有什么区别。对于那些在家关注的人,我使用以下命令重建(在小牛队):/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user ; killall Dock
  • 您还可以“lsregister -dump >> lsregister.txt”以可以在文本编辑器中搜索的形式捕获数据库,并仔细检查其中的内容是否符合您的期望。

标签: objective-c macos cocoa finder uti


【解决方案1】:

您可以将您的应用程序设置为在代码中为特定文档类型默认启动的应用程序。我发现这在某些情况下是必要的,因为在 info.plist 中设置链接还不够。 这通常在您的应用控制器的 +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]);
}

【讨论】:

  • 谢谢,但在进行此类更改之前不应该提示用户吗?这对于沙盒应用程序是否允许?
  • 当然,通过 NSAlert 或任何其他方式要求用户为其他应用程序也可以处理的文件类型设置默认应用程序。对于沙盒,我没有使用它,所以我不能在那里发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2011-09-06
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多