Прожектор Spotlight NSDocument, вызывающий ошибку "deny file-write-data" в консоли

У меня есть изолированное приложение на основе NSDocument с плагином Spotlight для индексирования моих пользовательских документов.

Во время тестирования я заметил множество ошибок, регистрируемых на консоли с помощью плагина Spotlight, так как он индексирует документ:

5/4/15 3:11:18.765 PM sandboxd[432]: ([579]) mdworker(579) deny file-write-data 
  /Users/test/Desktop/test.document 
  (import fstype:hfs fsflag:480D000 flags:240000005E diag:0 isXCode:0
    uti:com.test.document 
  plugin:/TestApp.app/Contents/Library/Spotlight/TestApp Spotlight Importer.mdimporter - 
  find suspect file using: sudo mdutil -t 407144)

Похоже, что плагин пытается записать в файл, который он индексирует (хотя он имеет только доступ только для чтения).

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

[[TTCustomDocument alloc] initWithContentsOfURL:url ofType:contentType error:outError];

Вот трассировка стека:

Thread 4:
0   libsystem_kernel.dylib          0x00007fff9015ee92 __mac_syscall + 10
1   libsystem_sandbox.dylib         0x00007fff910140b0 sandbox_check + 206
2   AppKit                          0x00007fff8f75fc38 -[NSDocument _autosavingPossibilityConcern] + 213
3   AppKit                          0x00007fff8f75fb02 -[NSDocument _checkAutosavingPossibilityAndReturnError:] + 60
4   AppKit                          0x00007fff8f75f9cf -[NSDocument _checkAutosavingAndReturnError:] + 26
5   AppKit                          0x00007fff8f75f97e -[NSDocument _checkAutosavingAndUpdateLockedState] + 26
6   AppKit                          0x00007fff8f75e420 -[NSDocument _initWithContentsOfURL:ofType:error:] + 319
7   AppKit                          0x00007fff8f75e056 -[NSDocument initWithContentsOfURL:ofType:error:] + 230

Похоже, что автоматическая проверка как-то пытается записать документ.

Что я могу с этим поделать? Есть ли какой-то режим только для чтения, чтобы открыть NSDocument?

Обновить:

Воспроизвести:

  1. Создайте новый проект Xcode: "Приложение на основе документа Какао"
  2. Добавить плагин Spotlight
  3. Код для реализации NSDocument и плагина Spotlight находится здесь: https://gist.github.com/anonymous/c4929586dfa11a473673

1 ответ

Хорошо, так где же код для -[TTCustomDocument initWithContentsOfURL:ofType:error:] или любой другой пользовательский код инициализации, а также ваш -readFromURL:ofType:error и связанный код? Вероятно, вы вызываете что-то из одного из этих методов (init... и / или read...), что приводит к тому, что документ помечается как грязный (с несохраненными изменениями), что приводит к срабатыванию системы автосохранения. Это неправильное поведение в вашем TTCustomDocument учебный класс.

Я предполагаю, что вы вызываете что-то, что зарегистрировало изменение с менеджером отмены документа. Это легко сделать, если это документ с базовыми данными, и вы настраиваете некоторые исходные данные; это также легко сделать, если вы настроили исходные данные таким образом, что вы вызываете один из ваших собственных методов последовательности действий отмены. Самый простой обходной путь (рекомендуемый документацией) - позвонить [self.undoManager disableUndoRegistration]; перед изменениями и `[self.undoManager enableUndoRegistration]; после изменений и до возвращения себя.

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