如何使用新版Firebase(Swift 4)展示及下载已上传图片?
Firebase在Swift 4中下载并展示已上传图片的解决方案
嘿,我来帮你搞定这两个Firebase图片处理的问题~
一、先解决图片下载的问题
你已经把图片上传到user/\(uid)这个存储节点了,这里给你两种常用的下载方式:
方式1:先获取下载URL再加载图片
这种方式适合需要保存URL或者分享图片的场景,代码如下:
func downloadProfileImage(completion: @escaping ((_ image: UIImage?) -> ())) { guard let uid = Auth.auth().currentUser?.uid else { completion(nil) return } // 对应你上传的存储路径 let storageRef = Storage.storage().reference().child("user/\(uid)") // 获取图片的下载URL storageRef.downloadURL { url, error in if let error = error { print("获取下载链接失败:\(error.localizedDescription)") completion(nil) return } guard let imageURL = url else { completion(nil) return } // 用URLSession下载图片数据 URLSession.shared.dataTask(with: imageURL) { data, _, error in if let error = error { print("下载图片失败:\(error.localizedDescription)") completion(nil) return } guard let imageData = data, let image = UIImage(data: imageData) else { completion(nil) return } // 回到主线程更新UI(必须,因为网络请求在后台线程) DispatchQueue.main.async { completion(image) } }.resume() } }
方式2:直接获取图片数据(适合小图如头像)
如果是像头像这类不大的图片,可以直接从存储节点获取数据,省去URL请求的步骤:
func getProfileImageDirectly(completion: @escaping ((_ image: UIImage?) -> ())) { guard let uid = Auth.auth().currentUser?.uid else { completion(nil) return } let storageRef = Storage.storage().reference().child("user/\(uid)") // 设置最大允许下载的文件大小,这里设为10MB let maxAllowedSize: Int64 = 10 * 1024 * 1024 storageRef.getData(maxSize: maxAllowedSize) { data, error in if let error = error { print("获取图片数据失败:\(error.localizedDescription)") completion(nil) return } guard let imageData = data, let image = UIImage(data: imageData) else { completion(nil) return } DispatchQueue.main.async { completion(image) } } }
二、展示图片的方法
拿到下载好的UIImage之后,直接赋值给你的UIImageView就可以了,比如在ViewController里调用上面的方法:
// 假设你有一个名为profileImageView的UIImageView downloadProfileImage { [weak self] image in self?.profileImageView.image = image }
额外技巧:用FirebaseUI简化加载流程
如果你不想自己写网络请求代码,可以用Firebase官方的FirebaseUI库,它提供了UIImageView的扩展,能直接从Storage加载图片:
- 先在Podfile里添加依赖(Swift4对应版本建议用6.x):
pod 'FirebaseUI/Storage', '~> 6.0'
- 安装后导入库,然后直接调用:
import FirebaseUI // 直接加载图片到UIImageView,还能设置占位图 guard let uid = Auth.auth().currentUser?.uid else { return } let storageRef = Storage.storage().reference().child("user/\(uid)") profileImageView.sd_setImage(with: storageRef, placeholderImage: UIImage(named: "default-avatar"))
注意事项
- 确保你的Firebase项目配置正确,
GoogleService-Info.plist已经添加到项目中; - 检查Storage的安全规则,测试阶段可以暂时设置为
allow read, write: if true;,上线后一定要改成更严格的规则(比如只允许用户读取自己的图片)。
内容的提问来源于stack exchange,提问作者user9606399
相关产品推荐
相关产品推荐

