Swift на MacOS: не удается открыть файл из моего приложения - PullRequest
0 голосов
/ 31 марта 2020

Я пишу приложение, которое отображает список файлов 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.

1 Ответ

0 голосов
/ 31 марта 2020

Вы должны создать URL для файла, используя init(fileURLWithPath:) из URL, а не как обычный init?(string:)

let url = URL(fileURLWithPath: "/path/to/file.pdf") 

Затем вы можете открыть его в приложении по умолчанию, используя NSWorkspace.open метод экземпляра

NSWorkspace.shared.open(url)
...