Ios 将图像和帖子上载到Firebase 5数据库时出现问题

Ios 将图像和帖子上载到Firebase 5数据库时出现问题,ios,firebase,firebase-realtime-database,swift4,Ios,Firebase,Firebase Realtime Database,Swift4,我目前正试图上传一个照片URL,并在firebase数据库中发布标题。照片目前保存在firebase存储中,这很好,但是我希望它也出现在firebase数据库中。 我反复发现自己正在处理这个错误“类型为'StorageMetadata'的值没有成员'downloadURL'” 我知道在firebase 5中,要从存储中获取url,需要调用存储引用上的downloadURL,而不是元数据。我尝试了多种方法和示例,但都会导致错误 @ibvar照片:UIImageView! @IBOutlet弱var

我目前正试图上传一个照片URL,并在firebase数据库中发布标题。照片目前保存在firebase存储中,这很好,但是我希望它也出现在firebase数据库中。 我反复发现自己正在处理这个错误“类型为'StorageMetadata'的值没有成员'downloadURL'” 我知道在firebase 5中,要从存储中获取url,需要调用存储引用上的downloadURL,而不是元数据。我尝试了多种方法和示例,但都会导致错误

@ibvar照片:UIImageView!
@IBOutlet弱var captionTextView:UITextView!
@iBButtonItem:iBButtonItem!
@IBVAR弱共享按钮:UIButton!
var selectedImage:UIImage?
重写func viewDidLoad(){
super.viewDidLoad()
让TapSirture=UITapSirture识别器(目标:self,操作:#选择器(self.handleSelectPhoto));photo.AddGestureRecognitor(TapSirture)
photo.isUserInteractionEnabled=true
}
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
handlePost()
}
func handlePost(){
如果选择了图像!=nil{
self.shareButton.isEnabled=true
self.removeButton.isEnabled=true
self.shareButton.backgroundColor=UIColor(红色:0,绿色:0,蓝色:0,alpha:1)
}否则{
self.shareButton.isEnabled=false
self.shareButton.backgroundColor=.lightGray
self.removeButton.isEnabled=false
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
view.endEditing(真)
}
@objc func handleSelectPhoto(){
让pickerController=UIImagePickerController()
pickerController.delegate=self
当前(pickerController,动画:真,完成:无)
}
@iAction func shareButton_TouchUpInside(u发件人:任意){
view.endEditing(真)
让hud=JGProgressHUD(样式:。暗)
hud.textlab.text=“正在加载”
hud.show(在:self.view中)
平显关闭(后延迟:3.0)
如果让profileImg=self.selectedImage,则让imageData=UIImageJPEGresentation(profileImg,0.1){
让photoIdString=nsuid().uuidString
让storageRef=Storage.Storage().reference(forURL:“…”).child(“posts”).child(photoIdString)
storageRef.putData(imageData,元数据:nil,完成:{(元数据,错误)在
如果错误!=nil{
返回
}
//让photoUrl=url?.absoluteString
让photoUrl=元数据?.downloadURL()?.absoluteString
self.sendDataToDatabase(photoUrl:photoUrl!)
}
)}
}
@iAction func remove_TouchUpInside(u发送方:任意){
干净的
handlePost()
}
func sendDataToDatabase(photoUrl:String){
设ref=Database.Database().reference()
让postsReference=ref.child(“posts”)
让newPostId=postsReference.childByAutoId().key
让newPostReference=postsReference.child(newPostId)
newPostReference.setValue([“photoUrl”:photoUrl,“caption”:captionTextView.text!],withCompletionBlock:{
(错误,参考)在
如果错误!=nil{
ProgressHUD.淋浴错误(错误!.localizedDescription)
返回
}
ProgressHUD.showSuccess(“成功”)
self.clean()
self.tabbar控制器?.selectedIndex=0//将用户切换回所选tabbar 0=first 1=second等。
})
}
func clean(){
self.captionTextView.text=“”
self.photo.image=UIImage(命名为:“占位符照片”)
self.selectedImage=nil
}
}
扩展摄像机控制器:UIImagePickerController远程门,
UINavigationControllerDelegate{
func imagePickerController(picker:UIImagePickerController,
didFinishPickingMediaWithInfo:[字符串:任意]){
打印(“已完成介质拾取”)
如果let image=info[“UIImagePickerControllerOriginalImage”]
as?UIImage{
选择图像=图像
图片
}
//profileImage.image=infoPhoto
驳回(动画:真,完成:无)
}
}
导入UIKit
导入进度HUD
导入FirebaseStorage
导入FirebaseDatabase
类CameraViewController:UIViewController{
@IBVAR照片:UIImageView!
@IBVAR弱共享按钮:UIButton!
@IBOutlet弱var captionTextView:UITextView!
@iBButtonItem:iBButtonItem!
var selectedImage:UIImage?
重写func viewDidLoad(){
super.viewDidLoad()
让Tap手势=UITapGestureRecognitor(目标:self,动作:#选择器(self.handleSelectPhoto))
照片.AddGestureRecognitor(点击手势)
photo.isUserInteractionEnabled=true
}
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
handlePost()
}
func handlePost(){
如果选择了图像!=nil{
self.shareButton.isEnabled=true
self.removeButton.isEnabled=true
self.shareButton.backgroundColor=UIColor(红色:0,绿色:0,蓝色:0,alpha:1)
}否则{
self.shareButton.isEnabled=false
self.removeButton.isEnabled=false
self.shareButton.backgroundColor=.lightGray
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
view.endEditing(真)
}
@objc func handleSelectPhoto(){
让pickerController=UIImagePickerController()
pickerController.delegate=self
当前(pickerController,动画:真,完成:无)
}
//将照片共享到存储数据库
@iAction func shareButton_TouchUpInside(u发件人:任意){
view.endEditing(真)
ProgressHUD.show(“请稍候…”,交互:false)
如果让profileImg=self.selectedImage,则让photoData=profileImg.jpegData(压缩质量:0.1){
让photoIdStr
 @IBOutlet weak var photo: UIImageView!
@IBOutlet weak var captionTextView: UITextView!
@IBOutlet weak var removeButton: UIBarButtonItem!
@IBOutlet weak var shareButton: UIButton!
var selectedImage: UIImage?
override func viewDidLoad() {
    super.viewDidLoad()

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleSelectPhoto)); photo.addGestureRecognizer(tapGesture)
    photo.isUserInteractionEnabled = true
}
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    handlePost()
}

func handlePost() {
    if selectedImage != nil {
       self.shareButton.isEnabled = true
        self.removeButton.isEnabled = true
        self.shareButton.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1)
    }else{
        self.shareButton.isEnabled = false
        self.shareButton.backgroundColor = .lightGray
        self.removeButton.isEnabled = false


    }
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)

}
@objc func handleSelectPhoto() {
    let pickerController = UIImagePickerController()
    pickerController.delegate = self
    present(pickerController, animated: true, completion: nil)

}
@IBAction func shareButton_TouchUpInside(_ sender: Any) {
    view.endEditing(true)
    let hud = JGProgressHUD(style: .dark)
    hud.textLabel.text = "Loading"
    hud.show(in: self.view)
    hud.dismiss(afterDelay: 3.0)

    if let profileImg = self.selectedImage, let imageData = UIImageJPEGRepresentation(profileImg, 0.1) {
        let photoIdString = NSUUID().uuidString
    let storageRef = Storage.storage().reference(forURL: ".......").child("posts").child(photoIdString)
        storageRef.putData(imageData, metadata: nil, completion: { (metadata, error) in
            if error != nil {
                return
            }

            //let photoUrl = url?.absoluteString
            let photoUrl = metadata?.downloadURL()?.absoluteString


            self.sendDataToDatabase(photoUrl: photoUrl!)
    }
    )}
}
@IBAction func remove_TouchUpInside(_ sender: Any) {
   clean()
   handlePost()
}
func sendDataToDatabase(photoUrl: String) {
    let ref = Database.database().reference()
    let postsReference = ref.child("posts")
     let newPostId = postsReference.childByAutoId().key

    let newPostReference =  postsReference.child(newPostId)
    newPostReference.setValue(["photoUrl": photoUrl, "caption": captionTextView.text!], withCompletionBlock: {
        (error, ref) in
        if error != nil {
            ProgressHUD.showError(error!.localizedDescription)
            return
        }
        ProgressHUD.showSuccess("Success")
        self.clean()
      self.tabBarController?.selectedIndex = 0 // switches user back to selected tabbar 0 = first 1 = second etc.
    })

}
func  clean() {
    self.captionTextView.text = ""
    self.photo.image = UIImage(named:"placeholder-photo")
    self.selectedImage = nil
  }
}
 extension CameraViewController: UIImagePickerControllerDelegate, 
UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, 
didFinishPickingMediaWithInfo info: [String : Any]) {
    print("did finish picking media")
    if let image = info["UIImagePickerControllerOriginalImage"] 
as? UIImage {
        selectedImage = image
        photo.image = image
    }
    // profileImage.image = infoPhoto
    dismiss(animated: true, completion: nil)
 }
}
import UIKit
import ProgressHUD
import FirebaseStorage
import FirebaseDatabase

class CameraViewController: UIViewController {

    @IBOutlet weak var photo: UIImageView!
    @IBOutlet weak var shareButton: UIButton!
    @IBOutlet weak var captionTextView: UITextView!

    @IBOutlet weak var removeButton: UIBarButtonItem!
    var selectedImage: UIImage?

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture                           = UITapGestureRecognizer(target: self, action: #selector(self.handleSelectPhoto))
        photo.addGestureRecognizer(tapGesture)
        photo.isUserInteractionEnabled           = true
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
         handlePost()
    }


    func handlePost(){
        if selectedImage != nil {
            self.shareButton.isEnabled          = true
            self.removeButton.isEnabled         = true
            self.shareButton.backgroundColor    = UIColor(red: 0, green: 0, blue: 0, alpha: 1)
        } else {
            self.shareButton.isEnabled          = false
            self.removeButton.isEnabled         = false
            self.shareButton.backgroundColor    = .lightGray

        }
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view.endEditing(true)
    }

    @objc func handleSelectPhoto(){
        let pickerController                   = UIImagePickerController()
        pickerController.delegate              = self
        present(pickerController, animated: true, completion: nil)

    }


    // Share photos to the storage database
    @IBAction func shareButton_TouchUpInside(_ sender: Any) {
        view.endEditing(true)
        ProgressHUD.show("Please wait...", interaction: false)
        if let profileImg                     = self.selectedImage, let photoData = profileImg.jpegData(compressionQuality: 0.1) {

            let photoIdString                 = NSUUID().uuidString
            print(photoIdString)
            let storageRef                    = Storage.storage().reference(forURL:Config.STORAGE_ROOT_REF).child("Posts").child(photoIdString)
            storageRef.putData(photoData, metadata: nil, completion: { (metadata, error) in
                if error != nil  {
                    ProgressHUD.showError(error!.localizedDescription)

                    return
                }
                let photoUrl = metadata?.downloadURL()?.absoluteString
                self.sendDataToDatabase(photoUrl: photoUrl!)
            })

        } else {
            ProgressHUD.showError("Profile image can't be empty")
        }
    }


    @IBAction func remove_touchUpInside(_ sender: Any) {

        clean()
        handlePost()
    }

    func sendDataToDatabase(photoUrl:String){

            let ref                        = Database.database().reference()
            let postsReference             = ref.child("posts")
            let newPostId                  = postsReference.childByAutoId().key
            let newPostReference           = postsReference.child(newPostId)
        newPostReference.setValue(["photoUrl": photoUrl, "caption": captionTextView.text!], withCompletionBlock: {
            (error, ref) in
            if error != nil{
                ProgressHUD.showError(error!.localizedDescription)
                return
            }
            ProgressHUD.showSuccess("Success")
            self.clean()
            self.tabBarController?.selectedIndex  = 0

        })
    }

    func clean(){
        self.captionTextView.text       = ""
        self.photo.image                = UIImage(named: "placeholder-img")
        self.shareButton                = nil
    }
}

extension CameraViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate {

   func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        print("did Finish picking media")
       if let chosenImage = info[.originalImage] as? UIImage {

        selectedImage                  = chosenImage
        photo.image                    = chosenImage

        }

        dismiss(animated: true, completion: nil)
    }
}