来自iOS应用的数据未保存到Firebase数据库

时间:2017-06-07 16:02:50

标签: ios swift firebase firebase-realtime-database

我希望将我的应用中存储在4个标签和1个文本视图中的数据保存到我的Firebase数据库中,但我没有取得任何成功,下面是我编写的代码。该应用程序是一个填写的表单,并有一个保存按钮,一旦按下该按钮应该将数据发送到我的firebase数据库但是当我检查那里什么都没有?

我甚至不确定如何在此问题的控制台中检查错误。

import UIKit
import CoreLocation
import Firebase

class AddSightingViewController: UIViewController {

    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet weak var timeLabel: UILabel!
    @IBOutlet weak var latitudeLabel: UILabel!
    @IBOutlet weak var longitudeLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UITextView!

    var locManager = CLLocationManager()
    var currentLocation: CLLocation!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set Date & Time

        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .medium

        dateFormatter.setLocalizedDateFormatFromTemplate("EEEE, MMM d, yyyy") // // set template after setting locale

        let dateString = "\(dateFormatter.string(from: Date() as Date))"
        dateLabel.text = String(dateString)

        let timeFormatter = DateFormatter()
        timeFormatter.timeStyle = .medium

        timeFormatter.setLocalizedDateFormatFromTemplate("hhmm")

        let timeString = "\(timeFormatter.string(from: Date() as Date))"

        timeLabel.text = String(timeString)

        // Set Latitude & Longitude

        locManager.requestWhenInUseAuthorization()

        if (CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse ||
            CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways){
            currentLocation = locManager.location
            self.latitudeLabel.text = String("\(currentLocation.coordinate.latitude)")
            self.longitudeLabel.text = String("\(currentLocation.coordinate.longitude)")
        }
    }

    func post() {

        let date = dateLabel.text
        let time = timeLabel.text
        let latitude = latitudeLabel.text
        let longitude = longitudeLabel.text
        let sightingDescription = descriptionLabel.text

        let post: [String : AnyObject] = ["date" : date as AnyObject,
                                          "time" : time as AnyObject,
                                          "latitude" : latitude as AnyObject,
                                          "longitude" : longitude as AnyObject,
                                          "Description" : sightingDescription as AnyObject]

        var ref: DatabaseReference!

        ref = Database.database().reference()


        ref.child("Sightings").childByAutoId().setValue(post)

    }

    @IBAction func saveButton(_ sender: Any) {

        post()

    }
}

1 个答案:

答案 0 :(得分:2)

在AppDelegate中初始化Firebase或实际发布时,您是否在控制台上收到任何错误消息?如果您这样做,请更新您的帖子

如果没有: 确保在info.plist中将“允许任意载入”设置为“真实”。

确保write权限合适:

默认情况下,Firebase通过服务提供的一种Auth方法实现使用firebase对应用程序的用户进行身份验证。有时在创建新项目时会忽略这一点。如果您不想要验证(不推荐,但可以是公共可访问数据库的解决方案),您只需要转到数据库(在您的项目中)>规则并将其更改为:

// These rules give anyone, even people who are not users of your app,
// read and write access to your database
{
  "rules": {
    ".read": true,
    ".write": true
  }
}

您可以查看如何使用基本级别规则here

否则,如果这些不修复它,请在应用程序启动时以及发布时提供更多代码或控制台日志! (还要确保IBAction确实会触发......你会感到惊讶)通常,如果正在初始化firebase,你应该默认在App Launch上获得控制台消息。否则,当您使用您正在使用的setValue方法发布时,您将无法获得XCode控制台日志。使用setValue(_ value: Any?, withCompletionBlock block: @escaping (Error?, FIRDatabaseReference) -> Void)方法通常会更好:

    let ref = Database.database().reference().[..all the childs until where you post]

    ref.setValue(item) { (err, resp) in
                guard err == nil else {
                    print("Posting failed : ")
                    print(err)

                    return
                }
                print("No errors while posting, :")
                print(resp)
            }

从这里开始发布错误信息,如果以前的建议都没有,则发布resp内容!