2016-10-12 4 views
1

Firebase - это очень новая версия. Я смотрел учебник по Youtube для создания приложения с Firebase. К сожалению, у меня возникла ошибка при попытке получить доступ к URL-адресу изображения из Firebase, я не могу понять, почему я получил сообщение об ошибке, пока не распечатаю URL-адрес консоли и не скопировал его в адресную строку в браузере.Правило базы данных Firebase - отказ в доступе к изображениям (iOS)

У меня код 403 - Access denied от Firebase. Я также попытался использовать Google для решения моей проблемы, но ничего не изменилось. Я повторно написал правило базы данных, но это не сработает. Пожалуйста, помогите мне.

Мой код

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

Место I называется функция 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 
    } 
} 

Мой URL изображения выглядит следующим образом:

https: /firebasestorage.googleapis.com/v0/b/appchat-e1cc4.appspot.com/o/images%[email protected]%3Falt=media & token = 275419bf-c0a4-4fc5-932e-624df797f9d3

Примечание: HTTPS:/, я не знаю, почему я только получил 1 /.

PS: Я использую Xcode 8 и Swift 3

+0

Вы добавили файл 'GoogleService-Info.plist'? –

+0

Ошибка 403 исходит от хоста изображения, а не из базы данных Firebase. Как выглядит URL-адрес? –

+0

@FrankvanPuffelen Я редактирую свой вопрос, пожалуйста, проверьте URL-адрес – Kency

ответ

0

Кажется, это правила пытаются правила установки похожи на это:

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

Ваши правила более ограничительны, чем Kency's. Хотя это вообще хорошо, нет никаких шансов, что они разрешат проблему доступа. –

+0

Спасибо, что поддерживаете меня, но это не работает для меня, я получил разрешение от консоли – Kency

1

В функции loadAvatar, вы передаете загрузки URL в виде строки init(fileURLWithPath: String):

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

Вы должны пройти загрузки URL в init?(string: String) вместо этого. Кроме того, просто используйте URL-адрес, возвращаемый нашей библиотекой, вместо того, чтобы преобразовывать его в строку и обратно в URL-адрес.

Действительная ссылка изображение

https://firebasestorage.googleapis.com/v0/b/appchat-e1cc4.appspot.com/o/images%[email protected]?alt=media&token=275419bf-c0a4-4fc5-932e-624df797f9d3

init(fileURLWithPath: String) метод интерпретирует строку как локальный путь к файлу, который не то, что вы хотите. Это также объясняет, почему косые черты после https рухнули, а символы % и ? получили URL-кодировку.