>

다음 함수를 구현하고 싶습니다 :

<올>
  • 등록은 가능한 모든 이메일 주소로 내 앱을 통과합니다. 다음과 같은 형식 [email protected], [email protected], [email protected] ...
  • Firebase에서 이메일/비밀번호 인증을 사용하도록 설정했으며 다음 코드를 사용하여 사용자를 생성합니다.

        @IBAction func createButtonTapped(_ sender: UIButton) {
        view.endEditing(true)
        guard let image = selectedImage else { return }
        guard let imageData = image.jpegData(compressionQuality: 0.1) else { return }
        ProgressHUD.show("Lade", interaction: false)
        if manager.location != nil {
            // Aktuellen Standort laden
            let userLat = UserDefaults.standard.value(forKey: "current_latitude") as! String
            let userLong = UserDefaults.standard.value(forKey: "current_longitude") as! String
            AuthService.createUser(username: usernameTextfield.text!, email: emailtextfield.text!, password: passwortTextField.text!, imageData: imageData, onSuccess: {
                let location:CLLocation = CLLocation(latitude: CLLocationDegrees(Double(userLat)!), longitude: CLLocationDegrees(Double(userLong)!))
                // Update aktuellen Standort
                LocationApi.shared.locationManager(self.manager, didUpdateLocations: [location])
                ProgressHUD.showSuccess("Profil wurde erstellt")
                self.performSegue(withIdentifier: "registerSegue", sender: nil)
            }) { (error) in
                ProgressHUD.showError("User konnte nicht erstellt werden")
            }
        } else {
            ProgressHUD.dismiss()
            self.performSegue(withIdentifier: "RegistrationToErrorVc", sender: nil)
        }
    
    }
        // Account erstellen
    static func createUser(username: String, email: String, password: String, imageData: Data, onSuccess: @escaping () -> Void, onError: @escaping (_ error: String?) -> Void) {
        Auth.auth().createUser(withEmail: email, password: password) { (data, error) in
            if let err = error {
                onError(err.localizedDescription)
                return
            }
            // User erfolgreich erstellt
            guard let uid = data?.user.uid else { return }
            self.uploadUserData(uid: uid, username: username, email: email, imageData: imageData, onSuccess: onSuccess)
        }
    }
    
    
    static func uploadUserData(uid: String, username: String, email: String, imageData: Data, onSuccess: @escaping () -> Void) {
    
        let storageRef = Storage.storage().reference().child("profile_image").child(uid)
        storageRef.putData(imageData, metadata: nil) { (metadata, error) in
            if error != nil {
                return
            }
        storageRef.downloadURL(completion:  { (url, error) in
            if  error != nil {
                print(error!.localizedDescription)
                return
            }
            let profilImageURL = url?.absoluteString
    
            let ref = Database.database().reference().child("users").child(uid)
            ref.setValue(["uid": uid, "username" : username,"username_lowercase": username.lowercased(),"radius": "20", "email" : email, "profileImageURL": profilImageURL ?? "Kein Bild vorhanden"])
        })
         onSuccess()
        }
    }
    
    

    예를 들어 [email protected]과 같이 사용자를 추가하면 사용자가 인증에 작성되지만 데이터베이스에는 항목이 없습니다. 이 문제에 대한 특정 오류 메시지도 표시되지 않습니다.

    도움을 주셔서 감사합니다.

    • 답변 # 1

      storageRef.putData  그리고 storageRef.downloadURL  둘 다 비동기 함수입니다. 왜 setValue가 실행되지 않는지에 대한 추측은 storageRef.downloadURL 때문입니다.   storageRef.putData 이후 오류를 반환합니다  실제로 데이터를 아직 업로드하지 않았습니다.

      metaData 를 통해 업로드 URL을 검색하는 것이 좋습니다  이렇게 :

      guard let imageData = UIImageJPEGRepresentation(image, 0.75) else { return }
      let metaData = StorageMetadata()
      metaData.contentType = "image/jpg"
      storageRef.putData(imageData, metadata: metaData) { metaData, error in
          if error == nil, metaData != nil {
              // upload was successful
              if let url = metaData?.downloadURL() {
                  ref.setValue(["uid": uid, "username" : username,"username_lowercase": username.lowercased(),"radius": "20", "email" : email, "profileImageURL": url ?? "Kein Bild vorhanden"])
                  onSuccess()
              } else {
                  onSuccess()
              }
          } else {
              // error handle - your completion handler should really return a bool so you know if the upload was successful or not
              onSuccess()
          }
      }
      
      

    관련 자료

  • 이전 php - codeigniter의 URL을 기반으로 페이지를 리디렉션하는 방법은 무엇입니까?
  • 다음 android - 크로스바 WAMP 라우터 (013)와 함께 SSL 인증서 암호화 사용