通过双击或右键单击Cocoa app打开文件

时间:2016-07-08 17:47:10

标签: objective-c swift macos cocoa

我正在创建一个非基于文档的应用程序,可以打开和显示各种图像类型。在我的Info.plist中,我添加了支持的文件类型及其标识符(public.png,public.jpeg,public.tiff等)。在我的AppDelegate中,我实现了-[application:openFile:]方法(以及-[application:openFiles:]方法)。

以下是我的Info.plist的示例:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.png</string>
        </array>
    </dict>

    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.jpeg</string>
        </array>
    </dict>

...

</array>

当我右键单击PNG并选择我的应用程序时,我的应用程序会打开,但是-[application:openFile:]方法和-[application:openFiles:]方法都没有被调用。如果在我的应用程序打开后,我右键单击该文件并再次单击我的应用程序,调用-[application:openFiles:]方法,一切正常。

我只尝试过实现-[application:openFile:]方法,一切都和以前一样。仅在实施-[application:openFiles:]方法时相同。当我实现时,-[application:openFiles:]方法优先。

我添加了日志记录,以了解我的应用在启动时的初始化方式。当我的应用程序未打开并右键单击PNG图像时,我的应用程序的方法按以下顺序调用:

- [ViewController viewDidLoad]
- [AppDelegate applicationWillFinishLaunching:]
- [AppDelegate applicationDidFinishLaunching:]

打开我的应用程序后,再次右键单击该图像会产生以下方法调用:

- [AppDelegate application:openFiles:]

阅读documentation后,它表示如果用户双击某个文件,则调用顺序应为:

- [AppDelegate applicationWillFinishLaunching:]
- [AppDelegate application:openFile(s):]
- [AppDelegate applicationDidFinishLaunching:]

但是永远不会调用打开的文件方法。

我已经阅读过一堆其他stackoverflow帖子并遵循这些建议,但没有一个有效。有没有人想知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

一个古老的问题,我知道,但为了以防万一:我在上面注册之后才开始工作,并在Imported Type UTIs进行了输入:

<key>UTImportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Decision List</string>
        <key>UTTypeIdentifier</key>
        <string>com.brightscreentv.document.dlist</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>dlist</string>
            </array>
        </dict>
    </dict>
</array>

我有一个自定义文件类型.dlist,一旦上面的信息在info.plist中,当用户右键单击该文件并选择{{1}时,我在AppDelegate中收到了对以下方法的调用(无论应用程序是否需要打开)。

Open With