Firebase对我来说很新鲜。我在Youtube上看了一个用Firebase开发应用程序的教程。不幸的是,当我试图从Firebase访问图像的URL时,我得到了一个错误,我无法弄清楚为什么我得到了一个错误,直到我打印出URL到控制台并复制粘贴到浏览器的地址栏。
我从Firebase得到代码403 - Access denied
。我也试着用谷歌来解决我的问题,但没有任何改变。我重写了我的数据库规则,但它不起作用。请帮帮我。
extension UIImageView
{
func skin() {
self.layer.cornerRadius = 20
self.clipsToBounds = true
}
func loadAvatar(link:String){
let queue:DispatchQueue = DispatchQueue(label: "LoadingImage", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
let activity:UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.whiteLarge)
activity.frame = CGRect(x: self.frame.size.width/2, y: self.frame.size.height/2, width: 0, height: 0)
activity.color = UIColor.blue
self.addSubview(activity)
activity.startAnimating()
queue.async {
let url:URL = URL(fileURLWithPath: link)
do{
let data:Data = try Data(contentsOf: url)
DispatchQueue.main.async(execute: {
activity.stopAnimating()
self.image = UIImage(data: data)
})
}catch{// my app always jump into catch because can access image
activity.stopAnimating()
print("Error ")//error
}
}
}
}
我调用Loadavatar函数的地方:
extension ScreenListFriendViewController : UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return listFriend.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ScreenListFriendTableViewCell
cell.lblName.text = listFriend[indexPath.row].fullname
cell.imgAvatar.loadAvatar(link: listFriend[indexPath.row].linkAvt)
return cell
}
}
我的数据库规则:
{
"rules": {
".read": true,
".write":true
}
}
我的图片URL是这样的:
https:/firebasestorage.googleapis.com/v0/b/appchat-e1cc4.appspot.com/o/images%252Fpassion@gmail.com.jpg % 3法特= media&令牌= 275419 bf - c0a4 4 - fc5 - 932 - e - 624 - df797f9d3
注意:https:/,我不知道为什么我只得到1个/
。
PS:我使用Xcode 8和Swift 3
在loadAvatar
函数中,您将下载URL作为字符串传递给init(fileURLWithPath: String)
:
queue.async {
let url:URL = URL(fileURLWithPath: link)
do {
您应该将下载URL传递给init?(string: String)
。或者,直接使用库返回的URL,而不是将其转换为String再转换回URL。
您的实际图像链接是
https://firebasestorage.googleapis.com/v0/b/appchat-e1cc4.appspot.com/o/images%2Fpassion@gmail.com.jpg ? alt = media&令牌= 275419 bf - c0a4 4 - fc5 - 932 - e - 624 - df797f9d3
init(fileURLWithPath: String)
方法将字符串解释为本地文件路径,这不是您想要的。这也解释了为什么https
后面的斜杠被折叠,%
和?
字符被url编码。
似乎这是一个规则尝试设置规则类似于:
{
"rules": {
"my_field": {
".read": "auth == null",
".write": "auth == null"
}
}
}