NSDictionary загрузка NSURL с URLByResolvingBookmarkData

#cocoa #nsdictionary #sandbox #nsurl

#cocoa #nsdictionary #песочница #nsurl

Вопрос:

Я сейчас пытаюсь использовать решение для обработки данных закладок и повторно создаю NSURL, но оно не работает.NSURL правильно отформатирован, но когда я использую его для создания словаря или строки, они равны нулю. Код, который я использую, таков:

 - (NSData *)bookmarkFromURL:(NSURL *)url 
{ NSError *error = nil; NSData *bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
             includingResourceValuesForKeys:NULL
                              relativeToURL:NULL
                                      error:amp;error];
if (error) {
NSLog(@"Error creating bookmark for URL (%@): %@", url, error);
[NSApp presentError:error];
}

 return bookmark;
}

- (NSURL *)urlFromBookmark:(NSData *)bookmark {
NSURL *url = [NSURL URLByResolvingBookmarkData:bookmark
                                   options:NSURLBookmarkResolutionWithSecurityScope
                             relativeToURL:NULL
                       bookmarkDataIsStale:NO
                                     error:NULL];
return url;
}
 

Ответ №1:

Вот правильный трюк для сохранения и восстановления закладки с помощью NSURLBookmarkCreationWithSecurityScope для приложения 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];
}
 

Комментарии:

1. Не забудьте позвонить stopAccessingSecurityScopedResource , когда закончите. Из NSURL документов Apple: «Если вы не сможете отказаться от доступа к ресурсам файловой системы, когда они вам больше не нужны, ваше приложение пропускает ресурсы ядра. Если утечка достаточных ресурсов ядра приведет к утечке, ваше приложение потеряет способность добавлять местоположения файловой системы в свою изолированную среду, например, через Powerbox или закладки с защитой, до повторного запуска «.