Открытие файлов разных типов


#1

Есть задача открывать локальные разные типов фалов через приложение т.е. необязательно внутри интрефейса приложения.

Понятно, что можно любой тип обработать отдельно и показать внутри приложения: картинку загрузить в UIImage, PDF открыть через PDFKit и т.п.

Вопрос: вдруг есть ли какое-либо (подкапотное или нет) комплексное решение - например я закинул туда только локальный URL, а система открыла в дефолтном приложении?


#2

У приложений нет доступа в песочницу другого приложения.


#3

Это понятно. Я из своего локального контейнера хочу открывать файлы, после скачивания.


#4

Во внешних приложениях?


#5

В штатных, ассоциированных по типам файлов, как, скажем, в штатном почтовом клиенте: просто тапаю на файл и открывается он в нужном приложении, с которым ассоциировано его расширение.


#6

Нужное приложение, это всё равно отдельное приложение с отдельной песочницей, локальный url туда не предать.


#7

Ну да, так и должно быть по логике.
Но интересно как штатный почтовый клиент? Или там скорее всего передаётся внешняя ссылка для скачивания…


#8

Вот сейчас подумал: а ведь можно передать данные и открыть нужное приложение через URL-схему же?


#9

В приложение предать данные (и открыть его) вариантов только два:

  1. url scheme
  2. share extension

P.S. Хотя нет, брешу, share extension не может открывать приложения.


#11

Это я пока не знать - надо изучать ))


#12

Попробуй использовать либу QuickLook.

class FileViewController: QLPreviewControllerDataSource, QLPreviewControllerDelegate {

private let url: URL

init(with url: URL) {
    self.url = url
    super.init(nibName: nil, bundle: nil)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func viewDidLoad() {
    super.viewDidLoad()
    let previewController = QLPreviewController()
    previewController.dataSource = self
    previewController.delegate = self
    previewController.currentPreviewItemIndex = 0
    self.addChild(previewController)
    previewController.didMove(toParent: self)
    previewController.view.translatesAutoresizingMaskIntoConstraints = false

    self.view.addSubview(previewController.view)
    self.view.backgroundColor = previewController.view.backgroundColor

    NSLayoutConstraint.activate([
        previewController.view.topAnchor.constraint(equalTo: self.view.topAnchor),
        previewController.view.rightAnchor.constraint(equalTo: self.view.rightAnchor),
        previewController.view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
        previewController.view.leftAnchor.constraint(equalTo: self.view.leftAnchor)
        ])
}

// MARK: - QLPreviewControllerDataSource, QLPreviewControllerDelegate implementation

func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
    return 1
}

func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
    return URL(fileURLWithPath: self.url.path) as QLPreviewItem
}

}


#13

На первый взгляд может подойти. Хотя там вроде только превьюшки… Буду у мака - попробую.


#14

Это прямо то, что надо! Вот спасибо большое - отличная библиотека! :+1:
Вот здесь хороший подробный материал есть по работе этой нативной либы.


#15

Хочу ещё раз сказать огромное спасибо @lllevel за подсказку отличного фреймворка! Вот сейчас на него смотрю и понимаю, что правда пишут о незаслуженной неизвестности данного инструмента - ну правда, он очень крутой! Вот кручу его по всякому, а он всё показывает - и прост до безобразия, а функционален по полной. Ещё раз спасибо :smile: можно было бы ставить много лайков - поставил бы )))

ЗЫ такую функциональность надо включать в курс UIKit :smile: