无法在沙盒可可应用程序中执行shell脚本命令

时间:2016-01-17 17:01:21

标签: macos shell cocoa nstask appstore-sandbox

我开发了一个构建,存档和创建iOS应用程序文件的cocoa应用程序。现在我想将它发布到Mac App Store。我的应用运行正常,但不是沙盒模式。 App结构如下:

MyApp.app
|_Contents
  |_Resources
    |_BuildTask.command
  1. 我做的第一件事就是获得执行权限#34; BuildTask.command"。

    NSTask *permissionTask = [[NSTask alloc] init];
    permissionTask.launchPath = @"/bin/bash";
    permissionTask.arguments = @[@"-c", [NSString stringWithFormat:@"chmod +x %@", pathToBuildTask], @"run"];
    [permissionTask launch];
    [permissionTask waitUntilExit];
    
  2. 否则,BuildTask会产生错误:

    Problem Running Task: launch path not accessible
    
    1. 执行权限任务后,我使用包含xcodebuild命令的NSTask执行我的BuildTask.command文件。

      NSString *path = [NSString stringWithFormat:@"%@", [[NSBundle mainBundle] pathForResource:@"BuildTask" ofType:@"command"]];
      task.launchPath = path;
      task.arguments = scriptArguments;
      [task launch];
      [task waitUntilExit];
      
    2. 当App Sandbox在功能中关闭时,一切正常。当我启用App Sandbox for Mac App Store时,权限任务会出错:

      chmod: Unable to change file mode on .../MyApp.app/Contents/Resources/BuildTask.command: Operation not permitted
      

      当我手动在BuildTask.command上执行chmod时,默认使用BuildTask.com中的write命令和xcodebuild命令会产生如下错误:

      defaults[2264:70400] Could not write domain .../SampleApp/SampleApp/SampleApp-Info.plist; exiting
      
      xcodebuild[2410] (FSEvents.framework) FSEventStreamCreate: _FSEventStreamCreate: ERROR: watch_path() failed for '/'
      xcodebuild[2410] (FSEvents.framework) FSEventStreamCopyPathsBeingWatched(): failed assertion 'streamRef != NULL'
      
      ../MyApp.app/Contents/Resources/BuildTask.command: line 65:  2410 Segmentation fault: 11  xcodebuild -scheme "${SCHEME}" clean build CODE_SIGN_IDENTITY="${SIGNING_IDENTITY}" "${BUILD_ARGUMENT}" "${WORKSPACE_OR_PROJECT}"
      

      那么,我有机会将此工具发布到Mac App Store吗?

      任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

可能不是您想听的内容:

  
      
  1. 我做的第一件事就是获得执行权限#34; BuildTask.command"。
  2.   

这里有两个问题。首先,如果您希望从应用程序中更改文件的权限,您应该使用框架或系统调用直接执行此操作,而不是调用interface A<T> { method1(): A<T>; } interface B<T extends Function> extends A<T> { method2(): B<T>; } interface A<T> { method2<T extends Function>(): B<T>; } var foo: A<Function>; foo.method1(); foo.method2(); // works! 来执行shell,而shell又执行调用这些框架的命令或系统调用......

其次,您不应该尝试从应用程序中更改应用程序包的内容。如果您需要应用程序包中的文件具有执行权限,请在构建应用程序时进行设置。你可以在Xcode的构建阶段做到这一点。

  

那么,我有机会将此工具发布到Mac App Store吗?

很少或没有。

Xcode本身不是沙盒应用程序,您收到的错误消息表明它正在尝试执行违反其从您的应用程序继承的沙箱的操作。

HTH