Песочница Apple: отключите атомарное сохранение NSDocument для закладок в области документа

Я разместил этот вопрос на форуме разработчиков Apple и через неделю не получил ответа, поэтому надеюсь, что мне повезет больше.

Я создал стандартное основанное на документе приложение (используя NSDocument, сохраняя простые XML-файлы), которое мне теперь необходимо расширить, чтобы также сохранять закладки в области документа во внешние файлы, которые выбрал пользователь.

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

Фон

Поскольку мне было чрезвычайно трудно найти информацию об обнаруженной ошибке на форумах разработчиков Apple или в веб-поисках, я быстро документирую то, что нашел, на случай, если она поможет кому-то еще в той же лодке.

Ошибка, возвращенная неудачной попыткой:

Ошибка домена =NSCocoaErrorDomain Code=256 "Файл" somefile.xml "не может быть открыт".

где, как ни странно, somefile.xml - это (компонент имени файла) абсолютный URL-адрес, переданный как "lativeToURL:"в блоке кода ниже.

Есть отчеты, такие как App Sandbox: закладка в области документа не разрешается; не возвращает никаких ошибок, которые предложили проблему с песочницей / закладками, когда включено атомарное сохранение файла.

Предыдущие сообщения об этой проблеме не выдают ту же ошибку (они обычно относятся к ошибке без сообщения об ошибке), но я создал отдельное тестовое приложение (не использующее NSDocument) для проверки этого и обнаружил, что смог воспроизвести то же сообщение об ошибке, что и выше, с использованием следующего кода при записи файла:

// HACK: Save a temporary value to the file so that the file exists when creating the bookmark
NSString *temp = @"Temp";
[temp writeToURL:saveURL atomically:NO encoding:NSUTF8StringEncoding error:&error];
// Create bookmark to imageURL relative to the save location
NSData *bookmarkData = [imageURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:[saveURL absoluteURL] error:&error];
if(bookmarkData == nil) return;
// Convert NSData to a string format.
NSString *bookmarkString = [bookmarkData base64EncodedString];
// Write the file.
[bookmarkString writeToURL:saveURL atomically:YES encoding:NSUTF8StringEncoding error:&error];

При изменении последней строки на "атомно: НЕТ" закладки корректно разрешаются, и все работает как положено.

NSDocument и атомарное письмо

Поскольку в стандартной и рекомендуемой настройке NSDocument используются атомарные записи, и это не будет работать с одной из основных функций Sandbox, я ищу способ совместной работы закладок в области документа и NSDocument, что, как я предполагаю, означает поиск способа заставить NSDocument писать файл напрямую, а не атомарно.

Мне еще предстоит найти какое-либо работающее решение (на этих форумах или в более широком поиске), которое поможет обойти ошибки Apple.

Я мог бы переопределить один из

  • writeSafelyToURL: OfType: forSaveOperation: ошибка:
  • writeToURL: OfType: forSaveOperation: ошибка:
  • saveToURL: OfType: forSaveOperation: completionHandler:

но в каждом случае документация говорит: "если вы переопределите этот метод, обязательно вызовите реализацию суперкласса", что, вероятно, продолжит сохранять файл атомарно.

Моей целью было бы сделать это так, чтобы я мог продолжать поддерживать ожидания других пользователей, которые Apple подталкивает к разработчикам (к лучшему или к худшему), например. autosavesInPlace, версии и т. д. Но я готов пожертвовать этими тонкостями, чтобы иметь работающее изолированное приложение, которое может быть выпущено в AppStore.

0 ответов

Другие вопросы по тегам