NSCocoaErrorDomain Code = 256 Невозможно открыть файлы в формате «md» - PullRequest
0 голосов
/ 17 февраля 2019

Я разрабатываю приложение macOS для редактирования файлов, но получаю довольно досадную ошибку при попытке использовать NSDocumentController.shared.makeDocument для создания нового NSDocument экземпляра из URL-адреса файла.

Ниже приведенПростой пример того, как я звоню makeDocument.Файл test.md существует на диске.

let url = URL(fileURLWithPath: "/Users/me/Desktop/test.md"

do {
  let newDocument = try NSDocumentController.shared.makeDocument(withContentsOf: url, ofType: url.pathExtension)
  print("Created \(newDocument)")
} catch {
  print("Error: \(error)")
}

Проблема заключается в том, что этот вызов try завершается неудачно и достигает блока catch.Я получаю следующую ошибку:

Ошибка: Ошибка Domain = NSCocoaErrorDomain Code = 256 «Не удалось обработать« test.md », поскольку MyApp не может открывать файлы в формате« md ».»UserInfo = {NSLocalizedDescription = «test.md» не может быть обработан, поскольку MyApp не может открывать файлы в формате «md»., NSLocalizedFailureReason = MyApp не может открывать файлы в формате «md».}

Я полагаю, что правильно установил типы документов моего приложения для файлов уценки, как показано ниже:

info

Я попытался очистить сборку, удалив производные данныеа также добавление типа 'Imported UTI' для файлов разметки, но, похоже, ничего не работает.

Странно то, что через File> Open я могу открывать .md файлы, но не программно через makeDocument.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

makeDocument(withContentsOf:ofType:) ожидает тип как второй параметр, а не расширение.Посмотрите typeForContents(of url: URL) о том, как извлечь тип из URL.

См. Рис. 6-3 в https://developer.apple.com/library/archive/documentation/DataManagement/Conceptual/DocBasedAppProgrammingGuideForOSX/AdvancedTopics/AdvancedTopics.html

И, как Марек Н указал в своем ответе, вВ info.plist должен быть UTI (идентификатор) для типа документа.

0 голосов
/ 17 февраля 2019

Проверьте сгенерированный Info.plist с примером из XCode 10 Info.plist и их настройками.Также проверьте команду lsregister и посмотрите, зарегистрировано ли ваше приложение для обработки md.

lsregister (используйте switch dump или read man):

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister

Уценка документа:

<dict>
    <key>CFBundleTypeName</key>
    <string>Markdown Document</string>
    <key>CFBundleTypeExtensions</key>
    <array>
        <string>md</string>
        <string>mdown</string>
        <string>markdown</string>
        <string>text</string>
    </array>
    <key>LSItemContentTypes</key>
    <array>
        <string>net.daringfireball.markdown</string>
    </array>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleTypeIconFile</key>
    <string>net-daringfireball-markdown</string>
</dict>
...