gpt4 book ai didi

swift - Firebase Firestore 在 Swift 共享扩展中不起作用

转载 作者:行者123 更新时间:2023-11-28 07:25:03 36 4
gpt4 key购买 nike

我正在 Swift 中构建一个共享扩展,它将文档保存到 Firestore。到目前为止,我已经能够通过钥匙串(keychain)共享和应用程序组验证正确的用户。我还可以从新文档引用中获取文档 ID:

var ref = Firestore.firestore().collection("stuff").document()
print(ref.documentID) //prints the id

但是,当我尝试将某些内容保存到 Firestore 时,控制台中不会打印任何内容,这意味着我既没有收到来自 Firebase 的失败回调,也没有收到成功回调(请参阅下面我批处理更新的地方)。这是我的 ShareController.swift 文件:

class ShareViewController: SLComposeServiceViewController {

var sharedIdentifier = "asdf"

override func viewDidLoad() {
FirebaseApp.configure()
setupKeychainSharing()
}

func setupKeychainSharing() {

do {
try Auth.auth().useUserAccessGroup(sharedIdentifier)
} catch let error as NSError {

}
}

override func isContentValid() -> Bool {
return true
}

override func didSelectPost() {

if let content = extensionContext!.inputItems[0] as? NSExtensionItem {
if let contents = content.attachments {
for attachment in contents {

if attachment.hasItemConformingToTypeIdentifier(m4aType) {

attachment.loadItem(forTypeIdentifier: m4aType, options: nil, completionHandler: { (results, error) in
if error == nil {
if let url = results as? URL {

if let audioData = NSData(contentsOf: url) {
let fileName = url.lastPathComponent
if Auth.auth().currentUser != nil {

guard let myId = Auth.auth().currentUser?.uid else { return }

let batch = Firestore.firestore().batch()

let ref = Firestore.firestore().collection("projects").document()

let project: [String: Any] = [
"ownerId": myId,
"type" : "audio",
"extensionUrl" : audioUrl.absoluteString
]

batch.updateData(project, forDocument: ref)

let privateRef = Firestore.firestore().collection("user-private").document(myId)
let privateUpdate: [String: Any] = [
"projects" : FieldValue.arrayUnion([ref.documentID])
]
batch.updateData(privateUpdate, forDocument: privateRef)
batch.commit(completion: { (error) in
if let error = error {
print("error updating database: \(error.localizedDescription)")
} else {
print("Database updated successfully!!!!!")
self.extensionContext!.completeRequest( returningItems: [], completionHandler: nil)
}
})
}
}
}
}
})
}
}
}
}
}
}

最佳答案

您似乎正在尝试在项目节点中创建其他文档并更新用户私有(private)节点。如果是这样,问题中的代码将不起作用。

UpdateData: Updates fields in the document referred to by document. If document does not exist, the write batch will fail.

这是一个工作批处理写入函数,它向项目节点添加一个文档,该节点具有 Firestore 生成的文档 ID 和用于扩展名、ownerId 和类型的子字段,以及一个包含 documentId 为 id_0 的文档的 user_private 集合。

func batchWrite() {
let batch = self.db.batch()

let ref = self.db.collection("projects").document()
let project: [String: Any] = [
"ownerId": "id_0",
"type" : "audio",
"extensionUrl" : "some url"
]
batch.setData(project, forDocument: ref)

let privateRef = self.db.collection("user-private").document("id_0")
let privateUpdate: [String: Any] = [
"projects" : "some projects"
]
batch.setData(privateUpdate, forDocument: privateRef)

batch.commit(completion: { (error) in
if let error = error {
print("error updating database: \(error.localizedDescription)")
} else {
print("Database updated successfully!!!!!")
}
})
}

请注意,self.db 是对我的 Firestore 的类 var 引用。这样一来,您就不必继续输入 Firestore.firestore() 而是使用 self.db

另请注意,在这种情况下可能不需要批处理,因为它不会同时发生大量写入。

如果您不使用批处理,.addDocument 会将文档添加到集合中。

这是一个将任务写入任务集合并自动生成 documentId 的函数

func writeTask() {
let collectionRef = self.db.collection("tasks")
let data = [
"task": "some task"]
var ref: DocumentReference? = nil
ref = collectionRef.addDocument(data: data, completion: { err in
if let error = err {
print(error.localizedDescription)
}

print(ref?.documentID)
})
}

关于swift - Firebase Firestore 在 Swift 共享扩展中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56831376/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com