更新Firebase项目后遇StorageMetadata无downloadURL成员错误求助
解决Firebase Storage
StorageMetadata无downloadURL成员的错误 嘿,这个问题我太熟了——你这是碰到Firebase Storage SDK的API更新了!旧版本里通过metadata?.downloadURL()直接获取下载链接的方式已经被彻底移除,现在必须通过存储引用(StorageReference)的异步方法来获取下载链接。下面针对你三处代码分别给出修改方案:
第一处代码修改
原来的上传完成后直接从metadata取链接的逻辑要替换成调用存储引用的downloadURL(completion:)方法:
// Referencing Firebase storage child with the unique identifier, and updating with the image from the picker let imageRef = DatabaseManager.shared.REF_POSTS_IMAGES.child(imgUid) imageRef.putData(imgData, metadata: metaData, completion: { (metadata, error) in if error != nil { print("Unable to upload image Firebase storage") } else { print("Successfully uploaded image to Firebase storage") // 改用异步方法获取下载链接 imageRef.downloadURL { url, error in guard let downloadUrl = url?.absoluteString, error == nil else { print("Failed to get download URL: \(error?.localizedDescription ?? "Unknown error")") return } // 图片上传完成后,将链接提交到数据库 self.postToFirebase(imgUrl: downloadUrl) } } })
第二处代码修改
同样,先保留存储引用,上传成功后调用downloadURL方法:
func uploadImages(_ data:Data,userid:String){ let metadata = StorageMetadata() metadata.contentType = "image/jpeg" let imagesRef = Storage.storage().reference().child("photoPosts") let childRef = imagesRef.child(userid) childRef.putData(data, metadata: metadata) { (metadata, error) in if let error = error { print("Upload failed: \(error.localizedDescription)") return } // 获取下载链接并更新数据库 childRef.downloadURL { url, error in guard let imgUrl = url as NSURL?, error == nil else { print("Failed to get download URL: \(error?.localizedDescription ?? "Unknown error")") return } self.updateURL(userid: userid, user_URL: imgUrl) } } }
第三处代码修改
这里原来用了observe(.success)监听上传状态,上传完成后同样要通过存储引用调用downloadURL:
func save() { let newPostRef = Database.database().reference().child("posts").childByAutoId() let newPostKey = newPostRef.key // 1. save image if let imageData = UIImageJPEGRepresentation(image, 0.5) { let storageRef = Storage.storage().reference().child("images/\(newPostKey)") storageRef.putData(imageData).observe(.success, handler: { (snapshot) in // 异步获取下载链接 storageRef.downloadURL { url, error in guard let downloadUrl = url?.absoluteString, error == nil else { print("Failed to get download URL: \(error?.localizedDescription ?? "Unknown error")") return } self.downloadURL = downloadUrl let postDictionary = [ "imageDownloadURL" : self.downloadURL, "caption" : self.caption ] newPostRef.setValue(postDictionary) } }) } }
补充说明
这个API变更是Firebase Storage SDK的重大更新,移除metadata.downloadURL()的原因是获取下载链接需要和服务器交互,异步调用的方式更符合iOS的性能和设计规范。修改后记得测试每一处上传逻辑,确保错误处理覆盖到所有情况(比如获取链接失败的场景)。
内容的提问来源于stack exchange,提问作者SwiftBeginner123
相关产品推荐
相关产品推荐

