Значение типа "StorageMetadata" не имеет имени пользователя downloadURL '
Эй, мне нужна помощь в этом кодировании, я не уверен, что произошло. Он работал на днях. Ошибка возникает после if let ur; = metaData?.downladURL()
if let ur; = metaData?.downladURL()
func uploadProfileImage(_ image:UIImage, completion: @escaping ((_ url:URL?)->())) {
guard let uid = Auth.auth().currentUser?.uid else { return }
let storageRef = Storage.storage().reference().child("user/\(uid)")
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 {
if let url = metaData?.downloadURL() {
completion(url)
} else {
completion(nil)
}
// success!
} else {
// failed
completion(nil)
}
}
}
Ответы
Ответ 1
Вы, вероятно, обновили свои модули Firebase. В Firebase 5.0 они избавились от функции metaData?.downladURL()
. Вы должны следить за обновлением документов на их веб-сайте. Копирование оттуда:
// Data in memory
let data = Data()
// Create a reference to the file you want to upload
let riversRef = storageRef.child("images/rivers.jpg")
// Upload the file to the path "images/rivers.jpg"
let uploadTask = riversRef.putData(data, metadata: nil) { (metadata, error) in
guard let metadata = metadata else {
// Uh-oh, an error occurred!
return
}
// Metadata contains file metadata such as size, content-type.
let size = metadata.size
// You can also access to download URL after upload.
riversRef.downloadURL { (url, error) in
guard let downloadURL = url else {
// Uh-oh, an error occurred!
return
}
}
}
Firebase Storage: https://firebase.google.com/docs/storage/ios/upload-files
Ответ 2
// MARK: - handleRegister
func handleRegister() {
guard let email = emailTextField.text, let password = passwordTextField.text, let name = nameTextField.text else {
print("Error")
return
}
Auth.auth().createUser(withEmail: email, password: password) { (user, error) in
if error != nil {
// print("Error")
return
}
// MARK: - hadleLogin//
guard let uid = Auth.auth().currentUser?.uid else {
return
}
// MARK: - image successful authenficated user
let imageName = NSUUID().uuidString
let storageRef = Storage.storage().reference().child("profile_images").child("\(imageName).png")
if let profileImageUrl = self.profileImageView.image, let uploadData = UIImageJPEGRepresentation(self.profileImageView.image!, 0.1) {
storageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in
if error != nil, metadata != nil {
print(error ?? "")
return
}
storageRef.downloadURL(completion: { (url, error) in
if error != nil {
print(error!.localizedDescription)
return
}
if let profileImageUrl = url?.absoluteString {
let values = ["name": name, "email": email, "profileImageUrl": profileImageUrl]
self.registeUserIntoDatabaseWithUID(uid: uid, values: values as [String : AnyObject])
}
})
})
}
}
}
Ответ 3
Обновите свои стручки и поместите это вместо:
func uploadProfileImage(_ image:UIImage, completion: @escaping ((_ url:URL?)->())) {
guard let uid = Auth.auth().currentUser?.uid else { return }
let storageRef = Storage.storage().reference().child("user/\(uid)")
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 {
storageRef.downloadURL { url, error in
completion(url)
// success!
}
} else {
// failed
completion(nil)
}
}
}
Ответ 4
Удалите FirebaseStorage из вашей папки.
Закройте Xcode.
Перейдите в podFile, замените модуль "Firebase/Storage" на модуль "Firebase/Storage", "~> 4.0".
Сохраните podFile и откройте терминал
напиши: pod update и нажми Enter
Откройте Xcode и напишите следующее:
if let profileImg = self.selectedImage, let photoData = profileImg.jpegData(compressionQuality:0.1) {
storageRef.putData(photoData, metadata: nil, completion: { (metadata, error) in
if error != nil {
return
}
let profileImageUrl = metadata?.downloadURL()?.absoluteString
let ref = Database.database().reference()
let usersReference = ref.child("user")
let newUserReference = usersReference.child(uid!)
newUserReference.setValue(["username" :self.usernameTextField.text!, "email" :self.emailTextField.text!, "ProfileImageUrl":profileImageUrl])
})
Запустите проект, ошибки исчезнут