Sandboxed app & NSOpenPanel causes crashes

前端 未结 4 1870
梦谈多话
梦谈多话 2021-02-19 07:40

I am doing a simple file open panel in my Cocoa app. I enable entitlements and app sandboxing. But on OS X 10.9, when the app should open a dialog using NSOpenPanel

相关标签:
4条回答
  • 2021-02-19 08:20

    Indeed, you have to specifically allow Read/Write permissions on User Selected Files. In Xcode 5.1 this is under Capabilities - App Sandbox.

    enter image description here

    0 讨论(0)
  • 2021-02-19 08:24

    My OS X app "Make a Face," also has problems when attempting to call a simple file open panel. The app does not crash, but the "select file to open" window starts shimmering, the pixel light in the dialogue box starts throbbing, and mouse clicks have a delayed impact from anywhere between 20 to 40 seconds. Very surreal. This only happens in Mavericks 10.9.

    Sandbox entitlement "com.apple.security.files.user-selected.read-write" is enabled, as it has been for all previous uploads of the app. However, under Mavericks, the "throbbing light file open panel syndrome" makes opening a user selected JPEG or PNG file from within the app a very bumpy ride.

    0 讨论(0)
  • 2021-02-19 08:31

    I think that you need to activate "User selected file" in your app entitlements!

    Give it a try, in xcode 5 beta looks like this, in xcode 4 should be on the general page of your project, where you activate entitlements!

    let me know!

    --------- Edit

    Well, i think your problem is in how you call the panel.

    First, initialize the panel with:

    NSOpenPanel * openDlg = [NSOpenPanel openPanel];
    
    [openDlg setCanChooseFiles:NO];
    [openDlg setAllowsMultipleSelection:NO];
    [openDlg setCanChooseDirectories:YES];
    [openDlg setCanCreateDirectories:YES];
    

    finally, change the dialog "call" from:

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

    to:

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

    It should work now!

    0 讨论(0)
  • 2021-02-19 08:31

    In my case the problem for this error was calling [NSOpenPanel openPanel] on a thread that was not the main one. Encapsulating the whole thing inside a

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

    solved the problem

    0 讨论(0)
提交回复
热议问题