improve(ios): add container urls

pull/7184/head
charlie 2022-11-04 15:51:29 +08:00
parent f19bbc77b0
commit 8713ef84a8
5 changed files with 105 additions and 91 deletions

View File

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

View File

@ -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) {
if self.iCloudContainerUrl != nil {
validateDocuments(at: self.iCloudContainerUrl!)
}
var localContainerUrl: URL? {
return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
if self.localContainerUrl != nil {
validateDocuments(at: self.localContainerUrl!)
}
@objc func ensureDocuments(_ call: CAPPluginCall) {
call.resolve(["iCloudContainerUrl": self.iCloudContainerUrl?.absoluteString as Any,
"localContainerUrl": self.localContainerUrl?.absoluteString as Any])
}
if self.iCloudContainerUrl != nil {
validateDocuments(at: self.iCloudContainerUrl!)
}
func validateDocuments(at url: URL) {
if self.localContainerUrl != nil {
validateDocuments(at: self.localContainerUrl!)
}
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) {
let str = ""
let filename = url.appendingPathComponent(".logseq", isDirectory: false)
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)
}
}
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)
}
}
}
}

View File

@ -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)
print("picked folder url = " + url.path)
documentPicker.directoryURL = url
}
documentPicker.allowsMultipleSelection = false
documentPicker.delegate = self
documentPicker.modalPresentationStyle = UIModalPresentationStyle.fullScreen
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)
for url in urls {
items.append(url.absoluteString)
guard let documentDirectory = FileManager.default.urls(
for: .documentDirectory,
in: .userDomainMask
).first
else {
return
}
self._call?.resolve([
"path": items.first as Any,
"localDocumentsPath": documentsPath[0] as Any
])
let url = documentDirectory.appendingPathComponent(path)
print("picked folder url = " + url.path)
documentPicker.directoryURL = url
}
documentPicker.allowsMultipleSelection = false
documentPicker.delegate = self
documentPicker.modalPresentationStyle = UIModalPresentationStyle.fullScreen
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)
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
])
}
}

View File

@ -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])

View File

@ -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