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

如何使用新版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加载图片:

  1. 先在Podfile里添加依赖(Swift4对应版本建议用6.x):
pod 'FirebaseUI/Storage', '~> 6.0'
  1. 安装后导入库,然后直接调用:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:03:28