Приложение MacOS с выбранным пользователем правом на чтение и запись файла отклонено из Ma c App Store, поскольку SQLite создает временный файл при записи в базу данных - PullRequest
1 голос
/ 11 января 2020

У меня есть приложение 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.

...