Jelajahi Sumber

save temporary image files to cache directory, set default path to application support directory and not to the documents directory anymore

cyberta 3 tahun lalu
induk
melakukan
1f3c5a1948

+ 2 - 2
DcShare/Helper/ShareAttachment.swift

@@ -83,7 +83,7 @@ class ShareAttachment {
                 self.dcContext.logger?.debug("Unexpected data: \(type(of: data))")
             }
             if let result = result {
-                let path = ImageFormat.saveImage(image: result)
+                let path = ImageFormat.saveImage(image: result, directory: .cachesDirectory)
                 let msg = self.dcContext.newMessage(viewType: DC_MSG_GIF)
                 msg.setFile(filepath: path)
                 self.messages.append(msg)
@@ -114,7 +114,7 @@ class ShareAttachment {
                 result = nil
             }
             if let result = result,
-               let path = ImageFormat.saveImage(image: result) {
+               let path = ImageFormat.saveImage(image: result, directory: .cachesDirectory) {
                 let msg = self.dcContext.newMessage(viewType: DC_MSG_IMAGE)
                 msg.setFile(filepath: path)
                 self.messages.append(msg)

+ 6 - 6
deltachat-ios/Chat/ChatViewController.swift

@@ -1515,12 +1515,12 @@ class ChatViewController: UITableViewController {
     private func stageImage(_ image: UIImage) {
         DispatchQueue.global().async { [weak self] in
             guard let self = self else { return }
-            if let pathInDocDir = ImageFormat.saveImage(image: image) {
+            if let pathInCachesDir = ImageFormat.saveImage(image: image, directory: .cachesDirectory) {
                 DispatchQueue.main.async {
-                    if pathInDocDir.suffix(4).contains(".gif") {
-                        self.draft.setAttachment(viewType: DC_MSG_GIF, path: pathInDocDir)
+                    if pathInCachesDir.suffix(4).contains(".gif") {
+                        self.draft.setAttachment(viewType: DC_MSG_GIF, path: pathInCachesDir)
                     } else {
-                        self.draft.setAttachment(viewType: DC_MSG_IMAGE, path: pathInDocDir)
+                        self.draft.setAttachment(viewType: DC_MSG_IMAGE, path: pathInCachesDir)
                     }
                     self.configureDraftArea(draft: self.draft)
                     self.messageInputBar.inputTextView.becomeFirstResponder()
@@ -1531,7 +1531,7 @@ class ChatViewController: UITableViewController {
 
     private func sendImage(_ image: UIImage, message: String? = nil) {
         DispatchQueue.global().async {
-            if let path = ImageFormat.saveImage(image: image) {
+            if let path = ImageFormat.saveImage(image: image, directory: .cachesDirectory) {
                 self.sendAttachmentMessage(viewType: DC_MSG_IMAGE, filePath: path, message: message)
             }
         }
@@ -1539,7 +1539,7 @@ class ChatViewController: UITableViewController {
 
     private func sendSticker(_ image: UIImage) {
         DispatchQueue.global().async {
-            if let path = ImageFormat.saveImage(image: image) {
+            if let path = ImageFormat.saveImage(image: image, directory: .cachesDirectory) {
                 self.sendAttachmentMessage(viewType: DC_MSG_STICKER, filePath: path, message: nil)
             }
         }

+ 38 - 10
deltachat-ios/Helper/ImageFormat.swift

@@ -68,12 +68,12 @@ extension ImageFormat {
         return loadImageFrom(data: imageData)
     }
 
-    public static func saveImage(image: UIImage, name: String? = nil) -> String? {
+    public static func saveImage(image: UIImage, name: String? = nil, directory: FileManager.SearchPathDirectory? = .applicationSupportDirectory) -> String? {
         if image.sd_isAnimated,
            let data = image.sd_imageData() {
             let format = ImageFormat.get(from: data)
             if format != .unknown {
-                return ImageFormat.saveImage(data: data, name: name, suffix: format.rawValue)
+                return ImageFormat.saveImage(data: data, name: name, suffix: format.rawValue, directory: directory)
             }
         }
         let suffix = image.isTransparent() ? "png" : "jpg"
@@ -84,25 +84,53 @@ extension ImageFormat {
         return saveImage(data: data, name: name, suffix: suffix)
     }
 
-    public static func saveImage(data: Data, name: String? = nil, suffix: String) -> String? {
+    public static func saveImage(data: Data, name: String? = nil, suffix: String, directory: FileManager.SearchPathDirectory? = .applicationSupportDirectory) -> String? {
         var path: URL?
-        guard let directory = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask,
-                                                              appropriateFor: nil, create: false) as NSURL
-        else { return nil }
+
+        // ensure directory exists (application support dir doesn't exist per default)
+        let fileManager = FileManager.default
+        let urls = fileManager.urls(for: directory!, in: .userDomainMask) as [URL]
+        guard let identifier = Bundle.main.bundleIdentifier else {
+            print("err: Could not find bundle identifier")
+            return nil
+        }
+        guard let directoryURL = urls.last else {
+            print("err: Could not find directory url for \(String(describing: directory)) in .userDomainMask")
+            return nil
+        }
+        var subdirectoryURL = directoryURL.appendingPathComponent(identifier)
+        do {
+            try fileManager.createDirectory(at: subdirectoryURL, withIntermediateDirectories: true, attributes: nil)
+        } catch {
+            print("err: \(error.localizedDescription)")
+            return nil
+        }
+
+        // Opt out from iCloud backup
+        var resourceValues: URLResourceValues = URLResourceValues()
+        resourceValues.isExcludedFromBackup = true
+        do {
+            try subdirectoryURL.setResourceValues(resourceValues)
+        } catch {
+            print("err: \(error.localizedDescription)")
+            return nil
+        }
+
+        // add file name to path
         if let name = name {
-            path = directory.appendingPathComponent("\(name).\(suffix)")
+            path = subdirectoryURL.appendingPathComponent("\(name).\(suffix)")
         } else {
             let timestamp = Double(Date().timeIntervalSince1970)
-            path = directory.appendingPathComponent("\(timestamp).\(suffix)")
+            path = subdirectoryURL.appendingPathComponent("\(timestamp).\(suffix)")
         }
-
         guard let path = path else { return nil }
 
+        // write data
         do {
             try data.write(to: path)
             return path.relativePath
         } catch {
-            print(error.localizedDescription)
+            print("err: \(error.localizedDescription)")
             return nil
         }
     }