的NSData - 写入临时文件/目录
我有点失去了我的追求 -的NSData - 写入临时文件/目录
- 下载CKAsset(PDF文件)
- 分配一个临时文件名
- 写CKAsset的内容在文件名
我已成功地下载CKAsset和显示内容在一个UIWebView,但我绊倒步骤2和3,我有一个字符串的文件名,尽管尝试各种令状eToFile组合我收到错误。
我的代码是这样的:
let filename = record.object(forKey: "materialsFilename")
if materialsType == "PDF" || materialsType == "pdf" {
if let asset1 = record.object(forKey: "materialsFile") as? CKAsset {
let doc1Data : NSData? = NSData(contentsOf:asset1.fileURL)
let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename as! String)
let contentsOfFile = doc1Data
var error: NSError?
// Write File
if contentsOfFile.writeToFile(path, atomically: true, encoding: String.Encoding.utf8, error: &error) == false {
if let errorMessage = error {
print("Failed to create file")
print("\(errorMessage)")
}
} else {
print("File \(filename) created at tmp directory")
}
这个版本介绍错误 -
Cannot invoke 'writeToFile' with an argument list of type '(URL?, atomically: Bool, encoding: String.Encoding, error: inout NSError?)'
一旦创建将被传递到UIActivityViewController,临时文件打印/邮件/空投的PDF,只有CKAsset名称,UIActivityViewController无法将文件类型与任何用户安装的应用程序相关联,以供打印。
有点挠头和审查我的选择按照上述指针后,我改变了方向,并没有真正需要写文件,只需重命名CKAsset,我用下面的脚本实现 -
let materialsType = record.object(forKey: "materialsType") as! String
let filename = record.object(forKey: "materialsFilename") as! String
if materialsType == "PDF" || materialsType == "pdf" {
if let asset1 = record.object(forKey: "materialsFile") as? CKAsset {
let doc1Data : Data? = Data(contentsOf:asset1.fileURL) as Data?
let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)
self.materialsWebView.load(doc1Data! as Data, mimeType: "application/pdf", textEncodingName: "UTF-8", baseURL: NSURL() as URL)
self.filenameURL = [(fileURL)]
}
的关键似乎取决于对两行 -
let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)
和
self.filenameURL = [(fileURL)]
它为UIActivityViewController生成文件名,从而打开对许多其他应用程序的访问。
我只在Data类中找到以下函数。
func write(to: URL, options: Data.WritingOptions)
试试这个。
我建议你在Swift 3中使用Data而不是NSData。 – Lumialxk
你能在“contentsOfFile.writeToFile”之前设置一个断点吗? - >“路径”有什么价值。如果它为空,它将无法写入特定文件。也许te文件名不知何故?另一个选项:在最后设置断点。 “错误”包含什么? – Lepidopteron
在该阶段的路径似乎是CKAsset路径 - 路径=〜/库/缓存/ CloudKit/48e71b0c5ca5e4eb9add0599a376bae1d958ed3e /资产/ 40118308-8136-4A66-8321-66AD609798A6.01707e7ffadfd047f02bc4a1579e6bcd2dbadf2c0b,大小= 268270,UUID = 40118308-8136 -4A66-8321-66AD609798A6,签名= Bowcaps
您被允许写入云/使用用户的iCloud吗? – Lepidopteron