Using QLPreviewController for opening the multiple type document.It's only working in PDF case not other formats.I'm using this condition mimeType.hasPrefix("docx") and other file formats and execute the further code otherwise will go to else block.Code only working in pdf case other condition going to else block.Aslo I want when user click on file document immediately downloading start and save in phone.
class QuickLookViewController: UIViewController, QLPreviewControllerDelegate, QLPreviewControllerDataSource {
let previewController = QLPreviewController()
var previewItems: [PreviewItem] = []
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func openDoc(_ sender: UIButton) {
quickLook(url: URL(string: "https://filesamples.com/samples/document/txt/sample2.txt")!)
}
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
previewItems.count
}
func quickLook(url: URL) {
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
self.presentAlertController(with: error?.localizedDescription ?? "Failed to download the documents!!!")
return
}
guard
let httpURLResponse = response as? HTTPURLResponse,
let mimeType = httpURLResponse.mimeType,
mimeType.hasPrefix("docx") || mimeType.hasPrefix("jpeg") || mimeType.hasPrefix("jpg") ||
mimeType.hasSuffix("pdf") || mimeType.hasPrefix("xls") || mimeType.hasPrefix("txt")
else {
print((response as? HTTPURLResponse)?.mimeType ?? "")
self.presentAlertController(with: "the data downloaded it is not a valid pdf file")
return
}
do {
let suggestedFilename = httpURLResponse.suggestedFilename ?? "quicklook.pdf"
var previewURL = FileManager.default.temporaryDirectory.appendingPathComponent(suggestedFilename)
try data.write(to: previewURL, options: .atomic)
previewURL.hasHiddenExtension = true
let previewItem = PreviewItem()
previewItem.previewItemURL = previewURL
self.previewItems.append(previewItem)
DispatchQueue.main.async {
UIApplication.shared.isNetworkActivityIndicatorVisible = false
self.previewController.delegate = self
self.previewController.dataSource = self
self.previewController.currentPreviewItemIndex = 0
self.present(self.previewController, animated: true)
}
} catch {
print(error)
return
}
}.resume()
UIApplication.shared.isNetworkActivityIndicatorVisible = true
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem { previewItems[index]
}
}
func presentAlertController(with message: String) {
DispatchQueue.main.async {
UIApplication.shared.isNetworkActivityIndicatorVisible = false
let alert = UIAlertController(title: "Alert", message: message, preferredStyle: .alert)
alert.addAction(.init(title: "OK", style: .default))
self.present(alert, animated: true)
}
}
}
extension URL {
var hasHiddenExtension: Bool {
get { (try? resourceValues(forKeys: [.hasHiddenExtensionKey]))?.hasHiddenExtension == true }
set {
var resourceValues = URLResourceValues()
resourceValues.hasHiddenExtension = newValue
try? setResourceValues(resourceValues)
}
}
}
class PreviewItem: NSObject, QLPreviewItem {
var previewItemURL: URL?
}