Mac Sandboxed приложение теряет разрешения на файлы другим приложениям
-
27-10-2019 - |
Вопрос
Я разрабатываю приложение, которое в настоящее время является песочницей. Он действует как основной текстовый редактор. Недавно я хотел проверить, что происходит, когда я открываю файл в своем приложении и другое приложение одновременно, сделать обновление в одном приложении, а затем увидеть обновление в другом. я использую Coda
или же BBEdit
Как мои альтернативные редакторы. Если я отключаю песочницу - тогда этой проблемы не существует. Однако, поскольку приложения должны быть песочницей по состоянию на 1 марта, я бы предпочел реализовать решение, а не ждать и посмотреть.
Когда я открываю оба файла и делаю редактирование в своем приложении, а затем переключаюсь на другое приложение, изменения отражаются так, чтобы эти редакторы только что сохранили из моего приложения. Однако, если я выполняю обратное сохранение от их приложения, а затем перехожу к моему - без радости. Не выполняя никаких действий, консоль сообщает о двух конкретных ошибках: deny file-issue-extension
а также deny file-write-data
. Анкет Приложение, по -видимому, теряет привилегии для редактирования документа, так как оно было изменено внешним редактором после того, как документ был открыт в моем приложении. Если я попытаюсь сохранить файл в моем приложении, он просит дублировать документ, потому что он потерял доступ к исходному документу. Это не происходит наоборот, потому что эти приложения не были песочницей, и поэтому есть разрешения, которые не делает мое приложение. Также не кажется, что вы можете помешать другому приложению вносить изменения, если вы не хотите такого поведения.
В документации на разработчике. Apple.com не упоминается ничего об этом типе ситуации. Я не уверен, является ли это поведение. Если это так, то я могу просто сказать своему пользователю, что разрешения на документ были потеряны, и они должны либо сохранить новую версию, либо повторно открыть файл. Если это не предназначенное поведение, то какой метод в API NSDOCUMENT предоставит файл разрешение после того, как он будет потерян? Я предполагаю, что ответ является первым, что это задумано, но может ли кто -нибудь подтвердить и есть ли документация?
Решение
Без выполнения каких-либо действий консоли сообщают о двух конкретных ошибках: отрицание файлов-утепления и отрицание файло-записей-data. Приложение, по -видимому, теряет привилегии для редактирования документа, так как оно было изменено внешним редактором после того, как документ был открыт в моем приложении. Если я попытаюсь сохранить файл в моем приложении, он просит дублировать документ, потому что он потерял доступ к исходному документу
Правильное поведение в такой ситуации состоит в том, чтобы не перезаписать файл, а предложить пользователю, если они хотят перезагрузить документ, если это так, перезагрузить, а затем написать.
ОС поступает правильно, не позволяя слепой записи по изменению файла.
См. NSFilePresenter - (void) PresentIteMdidChange, чтобы увидеть, изменился ли он. Перечитайте файл, а затем посмотрите, сможете ли вы его сохранить. Вы не говорите, что вам было отказано в чтении в файле.
Кроме того, поскольку вы не опубликовали какой -либо код, может быть полезно показать, какой код вы используете для доступа к файлу и сохранить его. NSDocument имеет встроенную обработку для некоторых типов изменений файлов в песочнице.
Другие советы
Давайте позвоним в ваше приложение Scottedit и ваш конкурент в качестве Stackedit
Там может быть несколько вещей. NSDocument имеет метод LockDocument. Stackedit, возможно, заблокировал документ и не разблокировал его после сохранения. Если вы покидаете приложение, файл должен быть разблокирован и доступен для вашего приложения. Если это так, вам нужно будет создать уведомление о том, когда атрибуты файла изменяются с помощью Kqueue или другого.
Если другое приложение «блокирует» доступ к вашему приложению. Вы можете отправить электронное письмо этому разработчику и попросить его обновить его приложение, чтобы оно разблокировало документ после сохранения. Этот последний шаг в дополнение к настройке уведомлений, потому что другой разработчик может прийти и сделать то же самое (разбивая ваше приложение).