浏览代码

improve(ios): add container urls

charlie 3 年之前
父节点
当前提交
8713ef84a8

+ 2 - 2
ios/App/App/FileContainer.m

@@ -8,5 +8,5 @@
 #import <Capacitor/Capacitor.h>
 
 CAP_PLUGIN(FileContainer, "FileContainer",
-           CAP_PLUGIN_METHOD(ensureDocuments, CAPPluginReturnPromise);
-           )
+    CAP_PLUGIN_METHOD(ensureDocuments, CAPPluginReturnPromise);
+)

+ 37 - 37
ios/App/App/FileContainer.swift

@@ -11,50 +11,50 @@ import MobileCoreServices
 @objc(FileContainer)
 public class FileContainer: CAPPlugin, UIDocumentPickerDelegate {
 
-    var iCloudContainerUrl: URL? {
-        return FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
-    }
+  var iCloudContainerUrl: URL? {
+    return FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
+  }
+
+  var localContainerUrl: URL? {
+    return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
+  }
+
+  @objc func ensureDocuments(_ call: CAPPluginCall) {
 
-    var localContainerUrl: URL? {
-        return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
+    if self.iCloudContainerUrl != nil {
+      validateDocuments(at: self.iCloudContainerUrl!)
     }
 
-    @objc func ensureDocuments(_ call: CAPPluginCall) {
+    if self.localContainerUrl != nil {
+      validateDocuments(at: self.localContainerUrl!)
+    }
 
-        if self.iCloudContainerUrl != nil {
-            validateDocuments(at: self.iCloudContainerUrl!)
-        }
+    call.resolve(["iCloudContainerUrl": self.iCloudContainerUrl?.absoluteString as Any,
+                  "localContainerUrl": self.localContainerUrl?.absoluteString as Any])
+  }
 
-        if self.localContainerUrl != nil {
-            validateDocuments(at: self.localContainerUrl!)
-        }
+  func validateDocuments(at url: URL) {
 
-        call.resolve(["path": [self.iCloudContainerUrl?.absoluteString as Any,
-                               self.localContainerUrl?.absoluteString as Any]])
+    if !FileManager.default.fileExists(atPath: url.path, isDirectory: nil) {
+      do {
+        print("the url = " + url.path)
+        try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
+      } catch {
+        print("container doesn't exist")
+        print(error.localizedDescription)
+      }
     }
 
-    func validateDocuments(at url: URL) {
-
-        if !FileManager.default.fileExists(atPath: url.path, isDirectory: nil) {
-            do {
-                print("the url = " + url.path)
-                try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
-            } catch {
-                print("container doesn't exist")
-                print(error.localizedDescription)
-            }
-        }
-
-        let str = ""
-        let filename = url.appendingPathComponent(".logseq", isDirectory: false)
-
-        if !FileManager.default.fileExists(atPath: filename.path) {
-            do {
-                try str.write(to: filename, atomically: true, encoding: String.Encoding.utf8)
-            } catch {
-                print("write .logseq failed")
-                print(error.localizedDescription)
-            }
-        }
+    let str = ""
+    let filename = url.appendingPathComponent(".logseq", isDirectory: false)
+
+    if !FileManager.default.fileExists(atPath: filename.path) {
+      do {
+        try str.write(to: filename, atomically: true, encoding: String.Encoding.utf8)
+      } catch {
+        print("write .logseq failed")
+        print(error.localizedDescription)
+      }
     }
+  }
 }

+ 50 - 43
ios/App/App/FolderPicker.swift

@@ -12,63 +12,70 @@ import MobileCoreServices
 @objc(FolderPicker)
 public class FolderPicker: CAPPlugin, UIDocumentPickerDelegate {
 
-    public var _call: CAPPluginCall?
+  public var _call: CAPPluginCall?
 
-    @objc func pickFolder(_ call: CAPPluginCall) {
-        self._call = call
+  @objc func pickFolder(_ call: CAPPluginCall) {
+    self._call = call
 
-        DispatchQueue.main.async { [weak self] in
+    DispatchQueue.main.async { [weak self] in
 
-            let documentPicker = UIDocumentPickerViewController(
-              documentTypes: [String(kUTTypeFolder)],
-              in: UIDocumentPickerMode.open
-            )
+      let documentPicker = UIDocumentPickerViewController(
+        documentTypes: [String(kUTTypeFolder)],
+        in: UIDocumentPickerMode.open
+      )
 
-            // Set the initial directory.
+      // Set the initial directory.
 
-            if let path = call.getString("path") {
-                // guard let url = URL(string: path) else {
-                //     call.reject("can not parse url")
-                //     return
-                // }
+      if let path = call.getString("path") {
+        // guard let url = URL(string: path) else {
+        //     call.reject("can not parse url")
+        //     return
+        // }
 
-                guard let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
-
-                let url = documentDirectory.appendingPathComponent(path)
+        guard let documentDirectory = FileManager.default.urls(
+          for: .documentDirectory,
+          in: .userDomainMask
+        ).first
+        else {
+          return
+        }
 
-                print("picked folder url = " + url.path)
+        let url = documentDirectory.appendingPathComponent(path)
 
-                documentPicker.directoryURL = url
+        print("picked folder url = " + url.path)
 
-            }
+        documentPicker.directoryURL = url
+      }
 
-            documentPicker.allowsMultipleSelection = false
-            documentPicker.delegate = self
+      documentPicker.allowsMultipleSelection = false
+      documentPicker.delegate = self
 
-            documentPicker.modalPresentationStyle = UIModalPresentationStyle.fullScreen
+      documentPicker.modalPresentationStyle = UIModalPresentationStyle.fullScreen
 
-            self?.bridge?.viewController?.present(
-                documentPicker,
-                animated: true,
-                completion: nil
-            )
-        }
+      self?.bridge?.viewController?.present(
+        documentPicker,
+        animated: true,
+        completion: nil
+      )
     }
+  }
 
-    public func documentPicker(
-        _ controller: UIDocumentPickerViewController,
-        didPickDocumentsAt urls: [URL]
-    ) {
-        var items: [String] = []
-        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
+  public func documentPicker(
+    _ controller: UIDocumentPickerViewController,
+    didPickDocumentsAt urls: [URL]
+  ) {
+    var items: [String] = []
+    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
 
-        for url in urls {
-            items.append(url.absoluteString)
-        }
-
-        self._call?.resolve([
-            "path": items.first as Any,
-            "localDocumentsPath": documentsPath[0] as Any
-        ])
+    for url in urls {
+      items.append(url.absoluteString)
     }
+
+    print(items.first as Any)
+
+    self._call?.resolve([
+      "path": items.first as Any,
+      "localDocumentsPath": documentsPath[0] as Any
+    ])
+  }
 }

+ 9 - 3
src/main/frontend/mobile/core.cljs

@@ -10,7 +10,8 @@
             [frontend.mobile.intent :as intent]
             [frontend.mobile.util :as mobile-util]
             [frontend.state :as state]
-            [frontend.util :as util]))
+            [frontend.util :as util]
+            [cljs-bean.core :as bean]))
 
 
 (def *url (atom nil))
@@ -23,8 +24,13 @@
 (defn- ios-init
   "Initialize iOS-specified event listeners"
   []
-  (p/let [path (capacitor-fs/ios-ensure-documents!)]
-    (println "iOS container path: " (js->clj path)))
+  (p/let [^js path (capacitor-fs/ios-ensure-documents!)]
+    (when-let [path' (bean/->clj path)]
+      (state/set-state! :mobile/container-urls
+                        (update-vals path' #(cond-> %
+                                              string?
+                                              (js/decodeURIComponent))))
+      (println "iOS container path: " path')))
 
   (state/pub-event! [:validate-appId])
 

+ 1 - 0
src/main/frontend/state.cljs

@@ -158,6 +158,7 @@
      :assets/alias-dirs                     (or (storage/get :assets/alias-dirs) [])
 
      ;; mobile
+     :mobile/container-urls                 nil
      :mobile/show-action-bar?               false
      :mobile/actioned-block                 nil
      :mobile/show-toolbar?                  false