NSOpenPanel в песочнице разрешает нелегальный выбор - PullRequest
2 голосов
/ 02 июля 2019

Я работаю над новой версией своего изолированного приложения и удалила все поддерживаемые типы файлов, кроме одного. Когда я запускаю приложение и выбираю Открыть в меню файлов, я могу выбирать и открывать только файлы с расширением типа файла моего приложения. Пока все хорошо.

Теперь у меня есть метод, который объединяет содержимое двух моих документов приложения. С одним открытым документом я вызываю 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».

...