2016-10-12 4 views
1

Firebaseは私にとってとても新しいものです。私はFirebaseでアプリを構築するためのYoutubeのチュートリアルを見ました。残念ながら、FirebaseからImageのURLにアクセスしようとするとエラーが発生します。なぜなら、URLをコンソールに出力してブラウザのアドレスバーにコピーして貼り付けるまでは、なぜエラーが出るのかわかりません。Firebaseデータベースのルール - 画像アクセスを拒否する(iOS)

Firebaseからコード403 - Access deniedを取得しました。私も問題を解決するために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 
      } 
     } 
    } 
} 

私は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 &トークン= 275419bf-c0a4-4fc5-932e-624df797f9d3

注:ます。https:/私は唯一の1 /を得た理由は、私は知りません。

PS:私はXcodeの8を使用し、スウィフト3

+0

あなたは 'GoogleService-Info.plist'ファイルを追加しましたか? –

+0

エラー403はFirebaseデータベースではなくイメージホストからのものです。 URLはどのように見えますか? –

+0

@FrankvanPuffelen私の質問を編集してください。URLを確認してください。 – Kency

答えて

0

が、それはルールを設定しようだようだが、これに似たルール:loadAvatar機能で

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

あなたのルールはKency'sよりも制限的です。これは一般的には良いことですが、これらがアクセスの問題を解決する可能性はありません。 –

+0

私をサポートしていただきありがとうございますが、私にとってはうまくいかない、私はコンソールから権限が拒否されました – Kency

1

、あなたはにStringとしてダウンロードURLを渡しますinit(fileURLWithPath: String)

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

あなたが代わりにinit?(string: String)にダウンロードURLを渡す必要があります。 また、ライブラリに返すURLをStringに変換して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エンコードされた理由についても説明します。

関連する問題