Я пишу приложение, которое отображает список файлов PDF в NSTableView, который пользователь должен иметь возможность дважды щелкнуть, чтобы открыть в приложении по умолчанию (Preview, Adobe Reader, ...).
Я пытался использовать NSWorkspace.shared.openFile
и NSWorkspace.shared.open(_: withAppBundleIdentifier: options: additionalEventParamDescriptor: launchIdentifiers:)
, но ни один из них не работает.
Я не могу использовать новый func open(URL, configuration: NSWorkspace.OpenConfiguration, completionHandler: ((NSRunningApplication?, Error?) -> Void)?)
, так как он предназначен для компьютеров до Catalina.
Вот два фрагмента кода:
1.
@objc func doubleClickOnResultRow() {
let clickedRow = resultsTableView.selectedRow
if ( clickedRow > -1 ) {
let myURL = foundItems[clickedRow] as URL
if (!NSWorkspace.shared.openFile(myURL.path)) {
print("Unable to open : ", myURL.path)
}
}
}
Этот первый ничего не делает, и я получаю сообщение «Невозможно открыть: url / to / my / file». pdf "в консоли.
2.
@objc func doubleClickOnResultRow() {
let clickedRow = resultsTableView.selectedRow
if ( clickedRow > -1 ) {
let myURL = foundItems[clickedRow] as URL
NSWorkspace.shared.open([myURL], withAppBundleIdentifier: "com.apple.Preview", options: NSWorkspace.LaunchOptions.withErrorPresentation, additionalEventParamDescriptor: nil, launchIdentifiers: nil)
}
}
С этим, однако, когда я дважды щелкаю файл, я получаю окно ошибки со значком Finder, которое говорит:
"Приложение« Мое приложение »не имеет разрешения на открытие« myfile.pdf. » Вот скриншот:
Ошибка Finder
Я не понимаю, что я делаю неправильно. В конце концов я могу создать облегченный просмотрщик PDF внутри моего приложения, но Я действительно хотел бы избежать этого, если это возможно.
РЕДАКТИРОВАТЬ 31/31/2020, 16: 10
Я попробовал третий способ, вызвав команду оболочки "open" с этим ( найдено здесь ):
func shell(_ command: String) -> String {
let task = Process()
task.launchPath = "/bin/bash"
task.arguments = ["-c", command]
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String
return output
}
, а затем
let command = "open \""+myURL.path+"\""
print(shell(command))
и я получаю
LSOpenURLsWithRole() failed with error -54 for the file path/to/my/file.pdf.