You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:07