我有一个使用Firebase Storage
存储图像的iOS
应用程序。上传图像后,我将其storage reference
保存在我的Firebase Database
中。当应用加载时,它会从数据库中获取各种storage references
,并使用FirebaseUI
方法显示其相应的图像,如下所示:
let storageRef = Storage.storage().reference(forURL: imageUrl)
imageView.sd_setImage(with: storageRef, placeholderImage: nil)
这很好用...但它非常慢。
在寻找加快Firebase Storage
速度的解决方案时,我发现这篇文章暗示使用图像的公共链接,即它的download url
,而不是它的storage reference
:https://stackoverflow.com/a/44362350/5225013
我的理解是,这与public urls
面前有一个CDN有关,而storage references
则没有。
可以使用以下代码在应用中检索download url
:
let storageRef = Storage.storage().reference(forURL: imageUrl)
storageRef.downloadURL { (downloadUrl, error) in
if let downloadUrl = downloadUrl {
// do something with downloadUrl
}
}
但是,以这种方式获得它对于我的目的毫无用处,因为进行异步调用会在显示图像之前花费额外的时间......
我一直在考虑编写一个云函数来将每个图像的download url
与其相应的storage reference
保存在数据库中,然后将其用于在应用程序中显示图像。这些图像不是个人的,也不包含敏感内容,所以我不介意它们是否公开。我主要想知道;如果我这样做,我有什么需要担心的吗?这是不常见的做法是有原因的吗?
你不需要"做"任何事情。
对于存储中的公共文件(即具有allow read;
安全规则的文件(,获取它们的 URL 是:
https://firebasestorage.googleapis.com/v0/b/(项目 ID(.appspot.com/o/(存储路径(?alt=media
我在应用程序中所做的是存储存储路径,然后使用简单的串联构造公共下载 URL。
就像一个魅力。
请注意,存储路径中的某些字符(如空格和斜杠(必须进行转义。在 JavaScript 中,您可以使用encodeURIComponent()
.
另请注意,强制实施存储应用检查会破坏这一点。