dictionaryWithContentsOfFile и песочница

#cocoa #sandbox

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

Вопрос:

Я создал приложение для Mac, которое загружает XML-файл из выбранной пользователем папки, и после использования приложения пользователь сохраняет настроенный файл (.adgf) Когда я пытаюсь загрузить файл .adgf (то есть файл plist), который содержит XML-путь в пределах одной записи, я вызываю dictionaryWithContentsOfFile, но он возвращает мне «ноль». Я думаю, что проблема в песочнице (иногда она работает, иногда нет). Путь к строке указан правильно. Может быть, когда пользователь загружает XML-файл, я должен сохранить его в «папке документов» конкретного приложения?

Редактировать: я сейчас пытаюсь использовать решение для обработки данных закладок и повторно создаю 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:

После того, как пользователь сохранит файл, вы должны взять данные закладки из URL-адреса, используя -[NSURL bookmarkDataWithOptions: includingResourceValuesForKeys: relativeToURL: error:]

Используйте NSURLBookmarkCreationWithSecurityScope для параметров.

Этот объект NSData должен где-то храниться (plist?), И когда вы захотите снова прочитать файл в более позднем сеансе, вы можете создать NSURL, совместимый с песочницей, из данных закладки, используя [NSURL
URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:]

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

1. Я уверен, что указание, которое вы написали здесь, правильное, но я безуспешно пытался. Я могу сохранить NSURL с NSData и вернуть его обратно с правильным NSURL, но [NSDictionary dictionaryWithContentsOfURL:bookmarkedUrl]; возвращайте мне всегда ноль.

2. Также вы говорите «После того, как пользователь сохранит файл», вы имеете в виду, что после того, как пользователь сохранит настроенный файл (.adgf), я должен вызвать bookmarkDataWithOptions? Но если пользователь сохраняет этот файл, например, на рабочем столе, а файл plist находится в другом каталоге, могу ли я получить доступ к файлу plist с помощью NSURL с URLByResolvingBookmarkData?

3. После того, как пользователь сохранит файл, вы должны вызвать bookmarkDataWithOptions . Я думал, что сохраненный файл (.adgf) был списком? Как создается список?

4. Пользователь открывает приложение, загружает список и файл изображения, поэтому я создаю закладки, хранящиеся в NSData. Когда пользователь сохраняет работу, используя файл .adgf, я записываю в него имена закладок NSData, чтобы я мог восстановить закладки plist и image, загруженные ранее. Я могу вернуть NSURLs (и они хорошо отформатированы) из NSData, когда я загружаю обратно файл .adgf, но когда я делаю mainDictionary = [NSDictionary dictionaryWithContentsOfURL:bookmarkedUrlPlist]; это ноль

5. Вам также необходимо добавить в закладки файл .adgf, поскольку этот файл не сохраняется в песочнице ваших приложений.