【问题标题】:Sandboxed app & NSOpenPanel causes crashes沙盒应用和 NSOpenPanel 导致崩溃
【发布时间】:2013-07-29 13:39:34
【问题描述】:

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

应用特定信息:
由于未捕获的异常'NSObjectNotAvailableException'而终止应用程序,原因:'service com.apple.appkit.xpc.openAndSavePanelService 未能代表由于 { "代理通信错误" = "错误域 = 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\U\U043e 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) {
        ...
    }];

有人见过吗?

【问题讨论】:

  • 请添加产生此错误的代码
  • 你有没有想过这个问题?我遇到了完全相同的问题。

标签: cocoa sandbox osx-mavericks


【解决方案1】:

确实,您必须明确允许对用户选择的文件具有读/写权限。在 Xcode 5.1 中,它位于 Capabilities - App Sandbox 下。

【讨论】:

  • 非常有帮助!谢谢杰。
【解决方案2】:

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

试一试,在 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) { ... }]; 

到:

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

它现在应该可以工作了!

【讨论】:

  • 我指定 "com.apple.security.files.user-selected.read-write" 权利。它仅在 OS X 10.9 上崩溃。
【解决方案3】:

在我的例子中,这个错误的问题是在一个不是主线程的线程上调用[NSOpenPanel openPanel]。将整个事物封装在一个

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

解决了问题

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 你找到解决办法了吗?
    • 我也看到了。我在小牛队,无法在其他任何事情上进行测试。但是,我第一次打开 NSOpenPanel 时,需要 forever...就像你说的 20-40 秒。我第二次调用它,它似乎很好。快把我逼疯了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多