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

How to use hardcoded file path names with sandbox

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

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

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

我将不胜感激 input/suggestions。

谢谢你

沙盒并不意味着未经用户选择就无法访问文件和文件夹。正如 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;
  }