Подтвердить что ты не робот

Приложение Mac Sandboxed потеряет права доступа к другим приложениям

Я разрабатываю приложение, которое в настоящее время изолировано. Он действует как основной текстовый редактор. Недавно я хотел проверить, что происходит, когда я открываю файл в своем приложении и другом приложении одновременно, делаю обновление в одном приложении, а затем вижу обновленный в другом. Я использую Coda или BBEdit в качестве моих альтернативных редакторов. Если я отключу песочницу, то этого вопроса не существует. Однако, поскольку приложения должны быть изолированы от 1 марта, я предпочел бы реализовать решение, а не ждать и видеть.

Когда я открываю оба файла и делаю редактирование в своем приложении, а затем переключаюсь на другое приложение, изменения отражаются так, что эти редакторы имеют только что сохраненную версию из моего приложения. Однако, если я выполню обратную сбережения от своего приложения, а затем перейду к моему - нет радости. Без каких-либо действий консоль сообщает о двух конкретных ошибках: deny file-issue-extension и deny file-write-data. Приложение, похоже, теряет привилегии для редактирования документа, так как он был изменен внешним редактором после того, как документ был открыт в моем приложении. Если я попытаюсь сохранить файл в своем приложении, он попросит дублировать документ, потому что он потерял доступ к исходному документу. Это не происходит наоборот, потому что эти приложения не были изолированы, и для этого у меня есть разрешения, которых нет в моем приложении. Также не кажется, что вы можете помешать другому приложению внести изменения, если вы не хотите этого поведения.

В документации на developer.apple.com ничего не говорится об этой ситуации. Я не уверен, что это предполагаемое поведение. Если да, то я могу просто сказать моему пользователю, что права на документы были потеряны, и они должны либо сохранить новую версию, либо повторно открыть файл. Если это НЕ предназначенное поведение, то какой метод в NSDocument API предоставит разрешение на файл после его потери? Я предполагаю, что ответ первый, что это предназначено, но может ли кто-нибудь подтвердить и есть документация?

4b9b3361

Ответ 1

Без каких-либо действий консоль сообщает о двух конкретных ошибках: deny file-issue-extension и deny file-write-data. Приложение, похоже, теряет привилегии для редактирования документа, так как он был изменен внешним редактором после того, как документ был открыт в моем приложении. Если я попытаюсь сохранить файл в своем приложении, он попросит дублировать документ, потому что он потерял доступ к исходному документу

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

ОС работает правильно, не позволяя слепой записи над измененным файлом.

См. NSFilePresenter - (void), представленныйItemDidChange, чтобы узнать, не изменилось ли оно. Перечитайте файл, а затем посмотрите, можете ли вы его сохранить. Вы не говорите, что вам отказали в чтении файла.

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

Ответ 2

Позволяет называть приложение ScottEdit и вашего конкурента как StackEdit

Там может быть несколько вещей. NSDocument имеет метод lockDocument. StackEdit может заблокировать документ и НЕ разблокировать его после сохранения. Если вы покинете приложение, файл должен быть разблокирован и доступен для вашего приложения. Если это так, вам нужно будет создать уведомление, когда атрибуты файла будут изменены с помощью kqueue или другого.

Если другое приложение блокирует доступ к вашему приложению. Вы можете отправить электронное письмо этому разработчику и попросить его обновить его приложение, чтобы он разблокировал документ после сохранения. Этот последний шаг в дополнение к настройке уведомлений, потому что другой разработчик может прийти и сделать то же самое (нарушение вашего приложения).