如何在沙箱中使用硬编码文件路径名
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;
}
好的,是的,我现在知道您不能在沙箱中使用硬编码路径。到目前为止,我还没有接触过沙箱,所以我从未遇到过它。
我有一个 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;
}