Objective c OSX Xcode:创建DMG时出现沙盒错误

Objective c OSX Xcode:创建DMG时出现沙盒错误,objective-c,cocoa,sandbox,nstask,appstore-sandbox,Objective C,Cocoa,Sandbox,Nstask,Appstore Sandbox,我有一个OSXcode项目,在我打开沙箱之前,它可以完美地工作 在“功能”下,我打开了沙盒和文件访问: 用户选择的文件-读/写 我的项目是这样的,当用户单击一个按钮时,NSSavePanel将弹出,用户指定保存目录和文件名(即myfile.dmg),一旦他或她单击保存,程序将使用NSTask和hdiutil创建dmg文件,直到到达特定路径。这是我的密码: __block NSSavePanel *saveDlg = [NSSavePanel savePanel]; // Enable o

我有一个OSXcode项目,在我打开沙箱之前,它可以完美地工作

在“功能”下,我打开了沙盒和文件访问: 用户选择的文件-读/写

我的项目是这样的,当用户单击一个按钮时,NSSavePanel将弹出,用户指定保存目录和文件名(即myfile.dmg),一旦他或她单击保存,程序将使用NSTask和hdiutil创建dmg文件,直到到达特定路径。这是我的密码:

__block NSSavePanel *saveDlg = [NSSavePanel savePanel];
    // Enable options in the dialog.
    [saveDlg setCanCreateDirectories:YES];
    [saveDlg setAllowedFileTypes:[NSArray arrayWithObject:@"dmg"]];
    [saveDlg setCanSelectHiddenExtension:YES];
    [saveDlg beginSheetModalForWindow:self.view.window completionHandler:^ (NSInteger result) {
        if (result == NSFileHandlingPanelOKButton) {

            BOOL bSuccess = [self checkErrorHandler: saveDlg.URL optionToCheck: 8];
            if (bSuccess) {
                [self createDMG:saveDlg.URL];
            }
        }

        saveDlg = nil;

    }];
以下是我的createDMG方法:

- (void)createDMG:(NSURL *)myurl{

self.url = myurl;
self.createTask = [[NSTask alloc] init];
NSPipe *outputPipe = [NSPipe pipe];
NSPipe *errorPipe = [NSPipe pipe];
NSPipe *writePipe = [NSPipe pipe];

self.fhCreateOutput = [outputPipe fileHandleForReading];
self.fhCreateError =  [errorPipe fileHandleForReading];

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

[nc addObserver:self selector:@selector(createNotifiedForStdOutput:) name:NSFileHandleReadCompletionNotification object:self.fhCreateOutput];
[nc addObserver:self selector:@selector(createNotifiedForStdError:)  name:NSFileHandleReadCompletionNotification object:self.fhCreateError];
[nc addObserver:self selector:@selector(createNotifiedForComplete:)  name:NSTaskDidTerminateNotification object:self.createTask];

NSFileHandle *writeHandle = [writePipe fileHandleForWriting];
NSString *pw = [self getPlainTextPassword:nil];

[writeHandle writeData: [[NSString stringWithFormat:@"%@\0\n", pw] dataUsingEncoding:NSUTF8StringEncoding]];
[writeHandle closeFile];
[self.createTask setStandardInput:writePipe];

NSString *directoryPath = [self.url.path stringByDeletingLastPathComponent];

NSString *fileName = [[self.url absoluteString] lastPathComponent];

[self.createTask setLaunchPath: @"/usr/bin/hdiutil"];
[self.createTask setCurrentDirectoryPath:directoryPath];

[self.createTask setArguments:[NSArray arrayWithObjects:@"create",  @"-puppetstrings", @"-encryption",@"AES-128", @"-size", @"100m", @"-verbose", @"-volname", @"test", fileName, @"-fs", @"HFS+J", @"-stdinpass", nil]];

[self.createTask setStandardOutput: outputPipe];
[self.createTask setStandardError:errorPipe];
[self.createTask launch];

[self.fhCreateOutput readInBackgroundAndNotify];
[self.fhCreateError readInBackgroundAndNotify];
}

我得到了以下错误:

2015-02-18 10:51:47.374 My DMG[41725:2016417] -[MyDMG 

createNotifiedForStdError:] verbose: 2015-02-18 10:51:46.745 diskimages-helper[41741:2016793] ERROR: couldn't connect to framework.
2015-02-18 10:51:47.376 My DMG[41725:2016417] -[MyDMG createNotifiedForStdError:] verbose: 2015-02-18 10:51:46.745 diskimages-helper[41741:2016793] DIHelper: setupConnectionToFrameworkWithUUID: failed
2015-02-18 10:51:46.747 hdiutil[41739:2016783] helper died
DIHLDiskImageCreate() returned 10
(null)
2015-02-18 10:51:47.665 My DMG[41725:2016417] -[MyDMG createNotifiedForStdError:] verbose: hdiutil: create: returning 10
2015-02-18 10:51:47.682 My DMG[41725:2016417] -[MyDMG createNotifiedForStdError:] verbose: hdiutil: create failed - No child processes
2015-02-18 10:51:47.687 My DMG[41725:2016417] task completed or was stopped with exit code 1
有人说NSTask不能很好地与sandbox配合使用,但我有另外两个项目在sandbox中运行NSTask,它们都起了作用。另外,如果你看一下mac应用商店,有一个类似的应用程序可以创建dmg(用户拖动文件夹并创建dmg文件)


非常感谢您的帮助:)

hdiutil是否在同一文件夹中创建任何中间文件?您是否尝试过在沙盒中的临时位置创建dmg,然后将其复制到用户指定的URL?不确定中间文件是什么意思。我尝试在沙盒内创建dmg:NSArray*urlPaths=[fileManager URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask];NSURL*appDirectory=[[urlPaths objectAtIndex:0]URLByAppendingPathComponent:bundleID isDirectory:YES];NSURL*bUrl=[appDirectory URLByAppendingPathComponent:[saveDlg.URL stringByDeletingLastPathComponent]]//同样的事情也发生了。我正在沙盒应用程序中使用NSTask,没有任何问题。你能试着启动一个简单的工具(例如“touch”)看看hdiutil是不是罪魁祸首吗?我试过使用NSTask来完成一个简单的任务,比如“ls-al”,效果很好,我还有几个其他项目使用NSTask和Sandbox,现在我正在使用NSTask来创建一些东西,我不确定这是许可问题还是什么。但是我100%肯定hdiutil可以与沙盒一起工作,如果你看看mac store,有相当多的应用程序可以创建dmg,要创建dmg,你必须使用hdiutil,你可以使用hdiutil在你的应用程序沙盒中创建dmg,然后将dmg复制到目标文件中。如果创建了任何其他临时文件,它们将在您的沙箱中。