从数据(字节数组)快速创建URL对象,而无需写入磁盘

时间:2019-02-12 01:24:55

标签: ios arrays swift url quicklook

如何在不将字节写入磁盘的情况下从数据(字节数组)创建Swift URL对象?

背景

我需要使用文件查看器(如QuickLook)在iOS(Swift)应用程序中查看安全文件,但我不想将文件写入磁盘。我知道Apple会进行磁盘加密,但这不是我们的选择。有什么方法可以将文件查看器(例如QuickLook)与仅在内存中的文件一起使用?

4 个答案:

答案 0 :(得分:0)

如果您的文档是PDF,则可以直接从Clean Build Folder初始化PDFDocument并将其显示在Data中,但我不能保证PDFView不会最终不会将数据临时写入磁盘。但是,我认为如果不写入磁盘就无法获得PDFDocument

答案 1 :(得分:0)

使用标准的iOS快速查看是不可能的。将文件存储在具有A类加密的某个临时目录中,如果您不希望它们退出应用程序,请使用托管企业应用程序,以确保您的数据不会退出托管世界。如果您希望Quick Look支持NSItemProvider,请提交错误。

答案 2 :(得分:0)

我们决定采用的解决方案是UIWebView。我们可以使用此呼叫:

webView.load(data: Data, mimeType: String, textEncodingName: String, baseURL: URL)

在我们应用程序的UIView中显示pdf,docx,xl​​sx,pptx,pdf,jpeg,png等。此调用使我们可以直接传递数据,而不必先将其保存到磁盘。

注意: 不推荐使用UIWebView,我们尝试使用WKWebViewKit。它具有相同的方法签名,但是我们无法使文件正确显示。每次结果都是一堆随机的废话字符。

答案 3 :(得分:0)

有一种使用URI方案的方法(data:MIME; base64):
(此代码示例中没有安全性,请强行打开包装等)。

let data = //... get image data
let base64String = data!.base64EncodedString()

let imgURIPath = "data:application/octet-stream;base64,\(base64String)"

// More clear with format?
//let imgURIPath = String(format: "data:application/octet-stream;base64,%@", base64String)


// We need a dummy base URL since URL(string:) is validating the URL
// and will return nil if there's no valid base
let baseURL = URL(string: "https://www.dummyURL.com")!

let uri = URL(string: imgURIPath, relativeTo: baseURL)!

// Test
let imageFromURI = try? UIImage(contentsOf: uri)