Используйте песочницу, чтобы открыть один файл и получить доступ к другому с тем же именем

#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];
}