沙盒应用程序& NSOpenPanel导致崩溃

时间:2013-07-29 13:39:35

标签: cocoa sandbox osx-mavericks

我在Cocoa应用程序中做了一个简单的文件打开面板。我启用了权利和应用沙盒。 但是在OS X 10.9上,当应用程序使用NSOpenPanel打开一个对话框时,它会崩溃:

  

特定应用信息:
  由于未捕获的异常“NSObjectNotAvailableException”而终止应用程序,原因是:'service com.apple.appkit.xpc.openAndSavePanelService无法代表由于{而无法初始化NSOpenPanelService的实例       “proxy-communications-error”=“错误域= NSCocoaErrorDomain代码= 4099 \”\ U041d \ U0435 \ U0443 \ U0434 \ U0430 \ U043b \ U043e \ U0441 \ U044c \ U0443 \ U0441 \ U0442 \ U0430 \ U043d \ U043e \ U0432 \ U0438 \ U0442 \ U044c \ U0441 \ U0432 \ U044f \ U0437 \ U044c \ U0441 \ U043f \ U0440 \ U043e \ U0433 \ U0440 \ U0430 \ U043c \ U043c \ U043e \ U0439- \ U043f \ U043e \ U043c \ U043e \ U0449 \ U043d \ 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) {
        ...
    }];

有没有人见过这个?

4 个答案:

答案 0 :(得分:26)

实际上,您必须明确允许对用户所选文件的读/写权限。在Xcode 5.1中,这是在功能 - 应用程序沙箱。

enter image description here

答案 1 :(得分:3)

我认为您需要在应用权利中激活“用户所选文件”!

尝试一下,在xcode 5 beta看起来像这样,在xcode 4应该在项目的常规页面上,你激活权利!

告诉我!

---------编辑

嗯,我认为你的问题在于如何调用面板。

首先,使用以下内容初始化面板:

NSOpenPanel * openDlg = [NSOpenPanel openPanel];

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

最后,从:

更改对话框“call”
[self.panel beginSheetModalForWindow:contextWindow completionHandler:^(NSInteger returnCode) { ... }]; 

为:

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

现在应该可以使用了!

答案 2 :(得分:0)

我的OS X应用程序“Make a Face”在尝试调用简单文件打开面板时也存在问题。该应用程序不会崩溃,但“选择要打开的文件”窗口开始闪烁,对话框中的像素灯开始悸动,鼠标点击从20到40秒之间的任何地方都有延迟的影响。非常超现实。这只发生在小牛队10.9。

沙盒权利“com.apple.security.files.user-selected.read-write”已启用,就像之前所有应用上传一样。然而,在Mavericks的情况下,“悸动光文件开放式面板综合症”使用户在应用程序中打开用户选择的JPEG或PNG文件非常颠簸。

答案 3 :(得分:0)

在我的情况下,此错误的问题是在不是主线程的线程上调用[NSOpenPanel openPanel]。将整个内容封装在

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

解决了问题