Firefase Firestore не работает в Swift Share Extension - PullRequest
1 голос
/ 01 июля 2019

Я создаю расширение общего доступа в Swift, которое сохраняет документ в Firestore.До сих пор я был в состоянии аутентифицировать правильного пользователя через совместное использование цепочки для ключей и группы приложений.Я также могу получить documentID из новой ссылки на документ:

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)
                            }
                          })
                        }
                      }
                    }
                  }
                })
              }
            }
          }
       } 
    }
}

1 Ответ

0 голосов
/ 04 июля 2019

Похоже, вы пытаетесь создать дополнительные документы в узле проектов и обновить частный пользовательский узел. Если это так, код в вопросе не будет работать.

UpdateData: обновляет поля в документе, на который ссылается документ. Если документ не существует, запись не удастся.

Вот рабочая функция пакетной записи, которая добавляет документ в узел проектов с идентификатором документа, сгенерированным Firestore и дочерними полями для расширения, ownerId и типа, а также коллекцию user_private с документом с идентификатором документа id_0.

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 является ссылкой на класс var моего Firestore. Это позволяет вам не вводить 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)
    })
}
...