NSSavePanel崩溃沙盒应用程序OS X 10.10(NSSavePanel crash in

2019-09-28 13:18发布

我使用的是NSSavePanel在OS X 10.10在沙盒应用,让用户选择保存文件(漂亮的标准)的位置,但应用程序崩溃时,我打电话:

NSSavePanel *panel = [NSSavePanel savePanel];

我得到这个在调试器:

2014-10-14 18:22:16.019 Farm Hand[2807:942766] an error occurred while attempting to connect to listener 'com.apple.view-bridge': Connection interrupted
2014-10-14 18:22:16.020 Farm Hand[2807:942766] *** Assertion failure in +[NSXPCSharedListener connectionForListenerNamed:fromServiceNamed:], /SourceCache/ViewBridge/ViewBridge-99/NSXPCSharedListener.m:394
2014-10-14 18:22:16.023 Farm Hand[2807:942766] An uncaught exception was raised
2014-10-14 18:22:16.023 Farm Hand[2807:942766] NSXPCSharedListener unable to create endpoint for listener named com.apple.view-bridge
2014-10-14 18:22:16.023 Farm Hand[2807:942766] (
    0   CoreFoundation                      0x00007fff8880364c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff9390e6de objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8880342a +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x00007fff8a3a65b9 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
    4   ViewBridge                          0x00007fff964e40b8 +[NSXPCSharedListener connectionForListenerNamed:fromServiceNamed:] + 151
    5   ViewBridge                          0x00007fff964c2981 -[NSRemoteViewBase serviceMarshalConnection] + 286
    6   ViewBridge                          0x00007fff964c36ae -[NSRemoteViewBase advanceToConfigPhase:awaitingWindowRights:] + 414
    7   ViewBridge                          0x00007fff964d1f7b -[NSWindowCentricRemoteView advanceToConfigPhase] + 947
    8   ViewBridge                          0x00007fff964c4223 -[NSRemoteViewBase viewServiceMarshalProxy:withErrorHandler:] + 88
    9   ViewBridge                          0x00007fff964ba8a8 -[NSRemoteViewBase bridge] + 207
    10  AppKit                              0x00007fff8e859b9d -[NSVBSavePanel init] + 303
    11  AppKit                              0x00007fff8e5a8ec1 +[NSSavePanel newRemotePanel] + 301
    12  AppKit                              0x00007fff8e5a8f53 +[NSSavePanel _crunchyRawUnbonedPanel] + 74
    13  Farm Hand                           0x000000010009526d __40-[RHFlockHomeViewController exportTable]_block_invoke_3 + 109
    14  libdispatch.dylib                   0x00000001002202bb _dispatch_call_block_and_release + 12
    15  libdispatch.dylib                   0x000000010021ad43 _dispatch_client_callout + 8
    16  libdispatch.dylib                   0x0000000100229d9f _dispatch_main_queue_callback_4CF + 1370
    17  CoreFoundation                      0x00007fff88756c59 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    18  CoreFoundation                      0x00007fff887132ef __CFRunLoopRun + 2159
    19  CoreFoundation                      0x00007fff88712838 CFRunLoopRunSpecific + 296
    20  HIToolbox                           0x00007fff94ec743f RunCurrentEventLoopInMode + 235
    21  HIToolbox                           0x00007fff94ec71ba ReceiveNextEventCommon + 431
    22  HIToolbox                           0x00007fff94ec6ffb _BlockUntilNextEventMatchingListInModeWithFilter + 71
    23  AppKit                              0x00007fff8e006821 _DPSNextEvent + 964
    24  AppKit                              0x00007fff8e005fd0 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 194
    25  AppKit                              0x00007fff8dff9f73 -[NSApplication run] + 594
    26  AppKit                              0x00007fff8dfe5424 NSApplicationMain + 1832
    27  Farm Hand                           0x0000000100010552 main + 34
    28  libdyld.dylib                       0x00007fff8d7e85c9 start + 1
)
2014-10-14 18:22:16.027 Farm Hand[2807:942766] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSXPCSharedListener unable to create endpoint for listener named com.apple.view-bridge'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff8880364c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff9390e6de objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8880342a +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x00007fff8a3a65b9 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
    4   ViewBridge                          0x00007fff964e40b8 +[NSXPCSharedListener connectionForListenerNamed:fromServiceNamed:] + 151
    5   ViewBridge                          0x00007fff964c2981 -[NSRemoteViewBase serviceMarshalConnection] + 286
    6   ViewBridge                          0x00007fff964c36ae -[NSRemoteViewBase advanceToConfigPhase:awaitingWindowRights:] + 414
    7   ViewBridge                          0x00007fff964d1f7b -[NSWindowCentricRemoteView advanceToConfigPhase] + 947
    8   ViewBridge                          0x00007fff964c4223 -[NSRemoteViewBase viewServiceMarshalProxy:withErrorHandler:] + 88
    9   ViewBridge                          0x00007fff964ba8a8 -[NSRemoteViewBase bridge] + 207
    10  AppKit                              0x00007fff8e859b9d -[NSVBSavePanel init] + 303
    11  AppKit                              0x00007fff8e5a8ec1 +[NSSavePanel newRemotePanel] + 301
    12  AppKit                              0x00007fff8e5a8f53 +[NSSavePanel _crunchyRawUnbonedPanel] + 74
    13  Farm Hand                           0x000000010009526d __40-[RHFlockHomeViewController exportTable]_block_invoke_3 + 109
    14  libdispatch.dylib                   0x00000001002202bb _dispatch_call_block_and_release + 12
    15  libdispatch.dylib                   0x000000010021ad43 _dispatch_client_callout + 8
    16  libdispatch.dylib                   0x0000000100229d9f _dispatch_main_queue_callback_4CF + 1370
    17  CoreFoundation                      0x00007fff88756c59 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    18  CoreFoundation                      0x00007fff887132ef __CFRunLoopRun + 2159
    19  CoreFoundation                      0x00007fff88712838 CFRunLoopRunSpecific + 296
    20  HIToolbox                           0x00007fff94ec743f RunCurrentEventLoopInMode + 235
    21  HIToolbox                           0x00007fff94ec71ba ReceiveNextEventCommon + 431
    22  HIToolbox                           0x00007fff94ec6ffb _BlockUntilNextEventMatchingListInModeWithFilter + 71
    23  AppKit                              0x00007fff8e006821 _DPSNextEvent + 964
    24  AppKit                              0x00007fff8e005fd0 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 194
    25  AppKit                              0x00007fff8dff9f73 -[NSApplication run] + 594
    26  AppKit                              0x00007fff8dfe5424 NSApplicationMain + 1832
    27  Farm Hand                           0x0000000100010552 main + 34
    28  libdyld.dylib                       0x00007fff8d7e85c9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

这是我在全码:

if ([format isEqualToString:@".csv"]) {
            loadingBar = [RHLoadingBar loadingBarWithMessage:@"Preparing File..."];
            [loadingBar showModally];
            [loadingBar start];
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                NSString *string = [[RHFileController sharedController] CSVTableWithObject:sheepArrayController.arrangedObjects propertyKeys:@[@"tagNumber", @"ukNumber", @"age", @"breed", @"comments"] columnHeaders:@[@"Tag Number", @"UK Number", @"Age", @"Breed",  @"Comments"]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [loadingBar stop];
                    [loadingBar dismiss];
                    NSSavePanel *panel = [NSSavePanel savePanel];
                    [panel beginSheetModalForWindow:[[NSApplication sharedApplication] mainWindow] completionHandler:^(NSInteger result) {

                    }]; 
                });
            });
        }

这是一个已知的bug或者是它的东西在我的代码? 如果这是一个已知的bug,我可以避开它。

  • 编辑:这是我应得围绕它,直到苹果修复(感谢对@serren的修正):

首先取消了Is Initial Controller在主窗口控制器(您的应用程序不会自动立即启动主窗口)。

然后:

AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>
// Add strong reference to the root window controller
@property (strong) NSWindowController *rootController;


@end

最后,在AppDelegate.m实施applicationDidFinishLaunching:像这样(记得要设置自己的初始控制器标识,在这里我的是“HomeView”):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    // Show main window (to avoid powerbox bug)...
    NSStoryboard *sb = [NSStoryboard storyboardWithName:@"Main" bundle:nil];
    rootController = [sb instantiateControllerWithIdentifier:@"HomeView"];
    [rootController showWindow:self];

    // Other custom setup for your App...
}

这个过程将意味着NSApplicationmainWindow属性将被设置为rootController.window自动。 所以,如果你想在任何时候让你的主窗口中,您仍然可以调用[[NSApplication sharedApplication] mainWindow]; 另外, AppDelegateNSApplication单都具有很强的参考该窗口中是很重要的(否则窗口将被释放,并且应用程序会崩溃)。

希望这有助于暂时。

Answer 1:

不幸的是上面的回答都无关,与我的方案,因为没有出现在屏幕上创建NSSavePanel上ArrayControllers。

一位评论原来的问题我指出了正确的方向,虽然,这是摆脱自定义WindowController子类。 当我这样做,面板出现了就好了。 然而,由于这不是一个很好的解决方案(如果你真的想保持你的自定义类),我不停地挖..

仅供参考,我使用NSStoryboards和构建应用程序为10.10。

我注意到一些奇怪的行为时,我(暂时)我的主窗口中选中“可恢复” - 每次保存面板出现了,我的应用程序的一个新的主窗口出现。 这使我相信,我的应用程序代表了与主窗口的主要断开正在显示 - 尤其是现在有一个单独的应用场景和故事板WindowController。

我做了什么:

  1. 选择我的主窗控制器与取消“在初始控制器”(即有故事板没有初始控制器集)
  2. 在我的应用程序的委托,在applicationDidFinishLaunching:我手动创建故事板并加载使用窗口控制器instantiateControllerWithIdentifier:
  3. 我设置了self.window到创建windowController.window财产
  4. 我self.window键和顺序前作出(使用makeKeyAndOrderFront:

应用程序启动,因为之前加载窗口,但现在保存面板出现就好了。 它还可以与一个自定义的windowController子类。

最后,作为奖励,我终于当使用有正确的行为applicationShouldTerminateAfterLastWindowClosed (被设置为NO)



Answer 2:

简短的介绍:

这看起来像为母校或任何它继承或IB的绑定系统某种程度上与ArrayController一个错误,也许是其他任何类似的控制器。 这里是演示了详细的问题,一个简单的代码: https://www.dropbox.com/s/atwoc2hweh5fjk6/Bug.zip?dl=0

详细描述:

它看起来像这样奇怪的事情是怎么回事SDK里面。

在我所提供的例子中我有一个标准的Xcode 6.1模板产生的标准应用。 该应用程序是沙箱。 里面的应用程序委托我们简单测试,如果NSSavePanel将触发没有任何问题。 所述的ViewController声明了一个所谓的“阵列”,这将在后面结合到一个NSArrayController特性(参见内部Main.storyboard)。

如果在此设置启动应用程序,你会看到NSSavePanel失败。 但是,如果我们简单地关掉NSArrayController的绑定,调用NSSavePanel奇迹般地工作。

因此,它是安全的假设,这不过是一个糟糕的错误隐藏在最新的SDK,其中苹果需要解决下面。

随意将样品添加到苹果的bug报告。

Woraround:

看起来,如果你禁用“引发不适用键”阵列控制器绑定你的应用程序,而无需关闭结合自身工作再次选项里面等。 这可能意味着一个例外是建立连接到XPC服务从而使应用程序行为不端的沙盘前提出。

正确的修复将是它是从哪里奇怪的错误和异常,因此确保其一直致力于守护苹果某处放XPC连接初始化代码。

UPDATE

基于serenn建议我用下面的代码,使我的应用程序像预期的那样:

    let sb = NSStoryboard(name: "Main", bundle: nil)!

    // ---

    rootWindowController = sb.instantiateControllerWithIdentifier("MainWindowController") as? NSWindowController

    // ---

    rootWindowController?.showWindow(self)

在我的测试中我发现, rootWindowController?.showWindow(self)的作品更好地展示窗口,而不是makeKeyAndOrderFront因为否则塞格斯没有得到正确连接(弹出窗口等)。 这个方法对我的作品。



Answer 3:

按照应用沙盒设计指南 ,你应该创建自己的NSDocument的子类。 NSDocument有其自己的呈现保存对话框的方法:

该NSDocument类Powerbox自动工作。 NSDocument还提供了沙箱中保存的文件,如果用户使用Finder中移动它们的支持。

请记住,当你的应用程序是沙箱的NSOpenPanel和NSSavePanel类的继承路径是不同的。 请参阅打开和保存对话框行为与App沙箱。

由于这种运行时的差异,一个NSOpenPanel或NSSavePanel对象继承与App沙盒更少的方法。 如果您尝试将消息发送到NSOpenPanel或NSSavePanel对象,并且该方法在NSPanel,NSWindow,或者NSResponder类类中定义,系统将引发异常。 Xcode的编译器不会发出警告或错误信息,提醒您这个运行时行为。



文章来源: NSSavePanel crash in sandbox app OS X 10.10