#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 или закладки с защитой, до повторного запуска «.