Приложение в песочнице и NSOpenPanel вызывают сбои

Я делаю простую панель открытия файлов в своем приложении Cocoa. Я включаю права и песочницу приложений. Но в OS X 10.9, когда приложение должно открыть диалоговое окно с помощью NSOpenPanel, оно вылетает с ошибкой:

Специфическая информация о приложении:
Завершение работы приложения из-за необработанного исключения "NSObjectNotAvailableException", причина: "службе com.apple.appkit.xpc.openAndSavePanelService не удалось инициировать экземпляр NSOpenPanelService от имени из-за {"proxy-communication-error" = "Домен ошибки = NSCocoaErrorDomain Code = 4099 \"\U041d\U0435 \U0443\U0434\U0430\U043b\U043e\U0441\U044c \U0443\U0441\U0442\U0430\U043d\U043e\U0432\U0432\U0444 U0441 \ u0432 \ u044f \ u0437 \ u043f \ u04441 \ u043f \ u0443c \ u043c \ u043f \ u0434- \ u043f \ u0434- \ u04343434 \ u043a \ u0438 \ u043a \ u0438 \ u043a \ u0438 \ u043a \ u043e \U043c.\" (Соединение было аннулировано этим процессом.) UserInfo=0x61000047dc00 {NSDebugDescription=Соединение было аннулировано этим процессом.}"; }'

Источник:

self.panel = [NSOpenPanel openPanel];
panel.delegate = self;
panel.canChooseDirectories = YES;
panel.canChooseFiles = NO;
panel.canCreateDirectories = YES;
panel.allowsMultipleSelection = NO;
[self.panel beginSheetModalForWindow:contextWindow completionHandler:^(NSInteger returnCode) {
        ...
    }];

Кто-нибудь видел это раньше?


person VKorsun    schedule 29.07.2013    source источник
comment
Пожалуйста, добавьте код, который создает эту ошибку   -  person Beryllium    schedule 29.07.2013
comment
Вы когда-нибудь догадывались об этом? У меня точно такая же проблема.   -  person robertmiles3    schedule 30.11.2013


Ответы (4)


Действительно, вы должны специально разрешить чтение/запись файлов, выбранных пользователем. В Xcode 5.1 это находится в разделе «Возможности» — «Песочница приложения».

введите здесь описание изображения

person Jay Versluis    schedule 06.05.2014
comment
Невероятно полезно! Спасибо, Джей. - person ixany; 19.07.2017

Я думаю, что вам нужно активировать «Файл, выбранный пользователем» в правах вашего приложения!

Попробуйте, в xcode 5 beta выглядит так, в xcode 4 должно быть на общей странице вашего проекта, где вы активируете права!

дайте мне знать!

--------- Редактировать

Ну, я думаю, ваша проблема в том, как вы называете панель.

Сначала инициализируйте панель с помощью:

NSOpenPanel * openDlg = [NSOpenPanel openPanel];

[openDlg setCanChooseFiles:NO];
[openDlg setAllowsMultipleSelection:NO];
[openDlg setCanChooseDirectories:YES];
[openDlg setCanCreateDirectories:YES];

наконец, измените диалог «вызов» с:

[self.panel beginSheetModalForWindow:contextWindow completionHandler:^(NSInteger returnCode) { ... }]; 

to:

if ([openDlg runModal] == NSOKButton) 
{ here you manage the user choice. } 

Теперь это должно работать!

person Benz    schedule 22.08.2013
comment
Я указываю право com.apple.security.files.user-selected.read-write. Вылетает только на OS X 10.9. - person VKorsun; 24.08.2013

Мое приложение OS X «Make a Face» также имеет проблемы при попытке вызвать простую панель открытия файла. Приложение не аварийно завершает работу, но окно «Выберите файл для открытия» начинает мерцать, пиксельный свет в диалоговом окне начинает пульсировать, а щелчки мышью имеют задержку от 20 до 40 секунд. Очень сюрреалистично. Это происходит только в Mavericks 10.9.

Право песочницы «com.apple.security.files.user-selected.read-write» включено, как и для всех предыдущих загрузок приложения. Однако в Mavericks «синдром пульсирующей световой панели открытия файла» делает открытие выбранного пользователем файла JPEG или PNG из приложения очень ухабистым.

person KAG    schedule 28.08.2013
comment
Вы когда-нибудь находили решение этой проблемы? - person KT_; 28.10.2013
comment
Я тоже это вижу. Я играю на Mavericks и не смог проверить его ни на чем другом. Но когда я впервые открываю NSOpenPanel, это занимает вечно... как вы сказали, 20-40 секунд. Второй раз звоню, вроде нормально. Сводит меня с ума! - person robertmiles3; 30.11.2013

В моем случае проблема с этой ошибкой заключалась в вызове [NSOpenPanel openPanel] в потоке, который не был основным. Инкапсуляция всего этого внутри

dispatch_async(dispatch_get_main_queue(), ^{
   NSSavePanel *saveAsPanel = [[NSSavePanel alloc] init];
   // ... bla bla...
 });

решил проблему

person Duck    schedule 09.10.2016