#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, поскольку этот файл не сохраняется в песочнице ваших приложений.