У меня есть приложение MacOS, которое я хочу разместить в магазине приложений Ma c, поэтому оно должно быть помещено в «песочницу». С помощью приложения пользователь создает несколько файлов базы данных SQLite, в которых хранится создаваемая ими информация, в некоторой степени аналогичная файлам электронных таблиц Excel, но я использую SQLite в своем приложении для создания, чтения и редактирования файлов. Они хранят эти файлы в папке «Документы» на своей ма c. Я добавил для этого право: com.apple.security.files.user-selected.read-write. Приложение может нормально читать эти файлы базы данных, но если я попытаюсь записать их, произойдет сбой.
По журналу консольного приложения Ma c ошибка:
Песочница: MyApp Helpe (16378) отказать (1) file-write-create / Users / steve / Documents /myFile1.sqlite-journal
Нарушение: отказать (1) file-write-create /Users/steve/Documents/myFile1.sqlite-journal
Так что это происходит из-за SQLite За кулисами создает временный файл с тем же именем, к которому он обращался, но изменяет расширение, добавляя к нему «-journal». Поэтому, если пользователь открывает файл с именем myFile1.sqlite, он открывает и читает нормально, но если он пытается записать в него, SQLite создаст временный файл с именем myFile1.sqlite-journal как часть процесса, а затем удалит его. Но поскольку пользователь не открыл и не сохранил файл с именем myFile1.sqlite-journal, он не находится в изолированной программной среде и ему отказано.
Я подтвердил, что это проблема, создав пустой файл в Finder с именем myFile1.sqlite-journal, и открыл его из моего приложения (таким образом добавив его как выбранный пользователем файл в песочницу), а затем смог написать в myFile1.sqlite.
Это известная проблема, и, по-видимому, решение по документам можно найти с помощью «Связанных элементов»: https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html.
Ниже приведен соответствующий текст, но это мое первое приложение ma c, и эти инструкции понятны как грязь. Дурачилась с ними несколько дней и до сих пор не знаю, что мне делать. Ниже перечислены расширения, но sqlite не имеет расширения набора. Вы просто используете любое расширение, которое хотите (скажем, .sqlite). Может кто-нибудь объяснить, какие свойства мне нужно добавить в список info.plist.
СВЯЗАННЫЕ ПУНКТЫ:
Функция связанных элементов в App Sandbox позволяет вашему приложению получить доступ файлы с тем же именем, что и выбранный пользователем файл, но с другим расширением. Эта функция состоит из двух частей: списка связанных расширений в файле Info.plist приложения и кода, который сообщает песочнице, что вы делаете.
Существует два распространенных сценария ios, в которых это имеет смысл:
Сценарий 1: (не относится к моей проблеме)
Сценарий 2. Ваше приложение должно иметь возможность открывать или сохранять несколько связанных файлов с одним и тем же именем и разными расширения (например, для автоматического открытия файла субтитров с тем же именем, что и файл mov ie, или для разрешения файла журнала SQLite).
Чтобы получить доступ к этому вторичному файлу, создайте класс это соответствует протоколу NSFilePresenter. Этот объект должен предоставлять URL-адрес основного файла в качестве его свойства primaryPresentedItemURL и должен предоставлять URL-адрес вторичного файла в качестве своего свойства presentItemURL.
После того, как пользователь открывает основной файл, объект представления файлов должен вызывать метод addFilePresenter: class в классе NSFileCoordinator для регистрации.
Примечание. В случае файла журнала SQLite, начиная с 10.8.2, автоматически добавляются файлы журнала, файлы регистрации с опережением записи и файлы общей памяти. в список связанных элементов, если вы открываете базу данных SQLite, поэтому этот шаг не требуется.
В обоих сценариях ios необходимо внести небольшое изменение в файл Info.plist приложения. Ваше приложение должно уже объявить массив Document Types (CFBundleDocumentTypes), который объявляет типы файлов, которые может открыть ваше приложение.
Для каждого словаря типов файлов в этом массиве, если этот тип файлов следует рассматривать как потенциально связанный тип для целей открытия и сохранения, добавьте ключ NSIsRelatedItemType с логическим значением YES.