#sandbox
#песочница
Вопрос:
Я бы открыл myfile.plist с помощью NSOpenpPanel, но я бы также обратился к myfile.png, если пользователь только что выбрал список. Я уже пытался получить доступ к png, делая
NSString* url = [[NSString stringWithFormat:@"file://localhost%@%@%@", pathWithoutFilename, @"/", imageFileName ]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
но делать:
NSData* imageData = [[NSData alloc] initWithContentsOfURL:nsurl];
NSImage *sourceImage = [[NSImage alloc] initWithData:imageData];
Значение NSImage равно нулю.
Как я могу?
Ответ №1:
Вот правильный способ сохранить и восстановить закладку с помощью NSURLBookmarkCreationWithSecurityScope для приложения Sandbox Cocoa: Наконец
-(void)saveTheNSData:(NSData *)data withFileName:(NSString *)fileName
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];
[data writeToFile:filePath atomically:NO];
}
-(NSURL*) getNSURLFromBookmarkIfExists:(NSString*) filename forType:(NSString*) type
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:filename];
NSData* data = [[NSData alloc] initWithContentsOfFile: filePath];
if(data != nil)
{
NSURL* outUrl = [NSURL URLByResolvingBookmarkData:[[NSUserDefaults standardUserDefaults] objectForKey:type] options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:nil error:nil];
[outUrl startAccessingSecurityScopedResource];
return outUrl;
}
else
return nil;
}
Также, пожалуйста, посмотрите на этот пример, чтобы узнать, как правильно настроить закладку, используя [NSUserDefaults standardUserDefaults], который делает трюк:
-(void) savePlistWithPlistUrl:(NSURL*) plistUrl andImageUrl:(NSURL*) imageUrl
{
NSData *bookmarkPlist = [self bookmarkFromURL:plistUrl];
NSArray* pathSplitted = [pathFilePlist pathComponents];
NSString* filenamePlist = [pathSplitted objectAtIndex:[pathSplitted count]-1];
NSData *bookmarkImage = [self bookmarkFromURL:imageUrl];
NSArray* pathImageSplitted = [imageUrl pathComponents];
NSString* filenameImage = [pathImageSplitted objectAtIndex:[pathImageSplitted count]-1];
NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:bookmarkPlist forKey:@"ExportPlist"];
[prefs setObject:bookmarkImage forKey:@"ExportImage"];
[prefs synchronize];
// save the data bookmark
[self saveTheNSData: bookmarkPlist withFileName:filenamePlist];
[self saveTheNSData: bookmarkImage withFileName:filenameImage];
}