沙箱中的NSOpenPanel允许非法选择

时间:2019-07-02 17:29:02

标签: sandbox nsopenpanel

我正在开发沙盒应用程序的新版本,并删除了所有受支持的文件类型(一种除外)。当我运行该应用程序并从文件菜单中选择“打开”时,我只能选择和打开带有我应用程序文件类型扩展名的文件。到目前为止,一切都很好。

现在,我有一个方法可以合并两个我的应用程序文档的内容。在打开一个文档的情况下,我调用NSOpenPanel获取第二个文件。但是,在这种情况下,我得到了意外的行为,即NSOpenPanel允许我选择不在我的应用程序文件类型列表中的文件。但是,它们是早期版本的应用程序可以打开的文件类型。这很奇怪,因为我从info.plist文件中删除了所有的文档类型,但没有一种。

当然,当我选择“禁止”文件时,在下面的代码中返回零。但是我不应该被允许首先选择它。为什么我会出现这种意外行为?

下面打开第二个文件的代码

NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger returnCode)
 {
     if (returnCode == NSOKButton) {
         NSArray *filesToOpen = [openPanel URLs];
         NSURL *absoluteURL = [filesToOpen objectAtIndex:0];
         NSDocumentController *docController = [NSDocumentController sharedDocumentController];
         [docController openDocumentWithContentsOfURL:absoluteURL
                                              display:NO
                                    completionHandler:^(NSDocument *document,
                                                        BOOL documentWasAlreadyOpen,
                                                        NSError *error){

                                        // open document code here...
                                    }];
     }
 }

更新:我的问题来自于不了解CFBundleTypeName和CFBundleTypeExtensions数组之间的区别。我所做的有些令人困惑,但是可以理解。

在新版本中,我将CFBundleTypeName设置为“ X”,并将CFBundleTypeExtensions设置为“ Y”。

在旧版本中,我将CFBundleTypeName设置为“ Z”,并将CFBundleTypeExtensions设置为“ X”。

当NSDocumentController创建NSOpenPanel时,我只能按预期选择扩展名为“ Y”的文件。但是,当我创建NSOpenPanel并将文件类型设置为“ X”时,便可以选择扩展名为“ X”和“ Y”的任何文件。与我认为的两种不同的行为是相同的NSOpenPanel配置。我不知道NSDocumentController是如何配置NSOpenPanel的,所以我无法选择扩展名为“ X”的文件。

0 个答案:

没有答案