Firebase数据库规则 - 拒绝访问图像(iOS)

时间:2016-10-12 12:45:21

标签: ios swift firebase firebase-security firebase-storage

Firebase对我很新。我在Youtube上观看了一个教程,用Firebase构建应用程序。不幸的是,当我尝试从Firebase访问图片的网址时出现错误,我无法弄清楚为什么在我将网址打印到控制台并将其复制粘贴到地址栏上之前我遇到错误浏览器。

我从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
    }

}

我的Firebase数据库规则:

{
  "rules": {
    ".read": true,
    ".write":true
  }
}

我的图片网址如下所示:

  

HTTPS:/firebasestorage.googleapis.com/v0/b/appchat-e1cc4.appspot.com/o/images%252Fpassion@gmail.com.jpg%3Falt=media&标记= 275419bf-c0a4-4fc5-932e- 624df797f9d3

注意: https:/ ,我不知道为什么我只有1 /

PS:我使用Xcode 8和Swift 3

2 个答案:

答案 0 :(得分:1)

loadAvatar函数中,您将下载URL作为字符串传递给init(fileURLWithPath: String)

queue.async {
  let url:URL = URL(fileURLWithPath: link)
  do {

您应该将下载网址传递给init?(string: String)。 或者,只需使用我们的库返回的URL,而不是将其转换为String并返回到URL。

您的实际图片链接

  

https://firebasestorage.googleapis.com/v0/b/appchat-e1cc4.appspot.com/o/images%2Fpassion@gmail.com.jpg?alt=media&token=275419bf-c0a4-4fc5-932e-624df797f9d3

init(fileURLWithPath: String)方法将字符串解释为本地文件路径,这不是您想要的。它还解释了为什么https折叠后的斜杠以及%?个字符进行了网址编码。

答案 1 :(得分:0)

似乎规则尝试设置与此类似的规则:

{
  "rules": {
    "my_field": {
    ".read": "auth == null",
    ".write": "auth == null"
    }
  }
}