Firebase数据库规则-获取映像访问被拒绝(iOS)



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"
    }
  }
}

相关内容

  • 没有找到相关文章

最新更新