好的,是的,我现在知道你不能在沙盒中使用硬编码路径。到目前为止,我还没有使用沙箱,所以我从未遇到过它。
我有一个Coredata App(Mac OSx),我使用默认的保存代码和默认路径位置(user /...../ applicationsupport / ...这个粗略的,在沙箱中是不可接受的。
每次启动程序时都不需要用户手动打开数据文件,还有另一种方法可以解决这个问题吗?
我很感激任何意见/建议。
谢谢你
答案 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;
}