2

When a user creates an account I would like the time and date they did it registered on the server. I am getting the following error when trying to do this.

Can only store objects of type NSNumber, NSString, NSDictionary, and NSArray.' .... libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

@IBAction func registerTapped(_ sender: Any) {
    let namec = nameTextField.text
    if let email = emailTextField.text, let pass = passwordTextField.text, let name = namec?.capitalized {
        FIRAuth.auth()?.createUser(withEmail: email, password: pass, completion: { (user, error) in
            if user != nil {
                //user found


                let interval = NSDate().timeIntervalSince1970
                let date = NSDate(timeIntervalSince1970: interval)



                self.refD?.child("Users").child((user?.uid)!).setValue(["Email": email, "Name": name, "User Created": date])

                print("User Created And Added To Database", email, name, date)
                self.performSegue(withIdentifier: "registertologin", sender: self)
            }

            }

1 Answers1

1

your error is relatively easy to solve , you are trying to save a value of type NSDate into firebase as this answer says you need to store your value as a number

let interval = NSDate().timeIntervalSince1970

and when you want to read it you read it like this , so your code should be something like this

let date = NSDate(timeIntervalSince1970: interval)

so your code should be something like this

@IBAction func registerTapped(_ sender: Any) {
let namec = nameTextField.text
if let email = emailTextField.text, let pass = passwordTextField.text, let name = namec?.capitalized {
    FIRAuth.auth()?.createUser(withEmail: email, password: pass, completion: { (user, error) in
        if user != nil {
            //user found


             let interval = NSDate().timeIntervalSince1970
             // let date = Date(timeIntervalSince1970: interval)





            self.refD?.child("Users").child((user?.uid)!).setValue(["Email": email, "Name": name, "User Created": interval])


            self.performSegue(withIdentifier: "registertologin", sender: self)
        }

        }

or the easiest thing you can do so you can avoid this type of error is to store it as a String

@IBAction func registerTapped(_ sender: Any) {
    let namec = nameTextField.text
    if let email = emailTextField.text, let pass = passwordTextField.text, let name = namec?.capitalized {
        FIRAuth.auth()?.createUser(withEmail: email, password: pass, completion: { (user, error) in
            if user != nil {
                //user found


                 let interval = NSDate().timeIntervalSince1970
                 let date = Date(timeIntervalSince1970: interval)
                 let dateFormatter = DateFormatter()
                 dateFormatter.dateFormat = "dd/MM/yyyy" // you can change the date format to whatever you want
                 let dateString = dateFormatter.string(from: date)




                self.refD?.child("Users").child((user?.uid)!).setValue(["Email": email, "Name": name, "User Created": dateString])


                self.performSegue(withIdentifier: "registertologin", sender: self)
            }

            }

PS : there are some other easiest approach to solve this issue that i will not include to my answer so i can let search and learn and remember a good code is a refactored code that should not repeat himself (don't repeat yourself!).

Community
  • 1
  • 1
Achref Gassoumi
  • 1,035
  • 10
  • 20