如何使用沙箱编写硬编码文件路径名

时间:2015-01-29 00:34:28

标签: macos cocoa core-data sandbox

好的,是的,我现在知道你不能在沙盒中使用硬编码路径。到目前为止,我还没有使用沙箱,所以我从未遇到过它。

我有一个Coredata App(Mac OSx),我使用默认的保存代码和默认路径位置(user /...../ applicationsupport / ...这个粗略的,在沙箱中是不可接受的。

每次启动程序时都不需要用户手动打开数据文件,还有另一种方法可以解决这个问题吗?

我很感激任何意见/建议。

谢谢你

1 个答案:

答案 0 :(得分:0)

Sandbox并不意味着没有用户选择就无法访问文件和文件夹。正如它在App Sandbox in Depth article容器目录中所述,您仍然可以访问。

要获取Application Support目录的路径,无论何时使用沙盒,都应使用相同的代码。

+ (NSString *)executableName
  {
   NSString *executableName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleExecutable"];
   if(!executableName || executableName.length==0)
      return nil;
   return executableName;
  }

- (NSString *)findOrCreateDirectory:(NSSearchPathDirectory)searchPathDirectory
                           inDomain:(NSSearchPathDomainMask)domainMask
                appendPathComponent:(NSString *)appendComponent
                              error:(NSError **)errorOut
  {
   NSArray *paths = NSSearchPathForDirectoriesInDomains(searchPathDirectory,domainMask,YES);
   if ([paths count]==0)
      return nil;
   NSString *resolvedPath = [paths objectAtIndex:0];
   if (appendComponent)
      resolvedPath = [resolvedPath stringByAppendingPathComponent:appendComponent];
   NSError *error;
   BOOL success = [self createDirectoryAtPath:resolvedPath withIntermediateDirectories:YES attributes:nil error:&error];
   if (!success)
     {
      if (errorOut)
         *errorOut = error;
      return nil;
     }
   return resolvedPath;
  }

- (NSString *)applicationSupportDirectory
  {
   NSError *error;
   NSString *result = [self findOrCreateDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask
                              appendPathComponent:[self executableName] error:&error];
   if (error)
      return nil;
   return result;
  }