So, I need to capture user's location (with their permission of course) before he gets to homepage. So on the login/register page I want to capture the location, but I need to do it before the override segue to homepage for logged in users. Any of you have any ideas? Below is the override segue.
I put location capturer before the segue in the override function, but it still went to homepage before the user had an opportunity to accept share location. This is not really unexpected since the entire override function is by definition an override function
override func viewDidAppear(_ animated: Bool) {
//////////////////////
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let databaseRef = Database.database().reference()
guard let uid = Auth.auth().currentUser?.uid else { return }
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
print("locations = \(locValue.latitude) \(locValue.longitude)")
latestLocation = ["latitude" : locValue.latitude, "longitude" : locValue.longitude]
let lat = locValue.latitude
let lon = locValue.longitude
dict = CLLocation(latitude: lat, longitude: lon)
print("dict", dict)
if let locationDictionary = latestLocation {
databaseRef.child("people").child(uid).child("Coordinates").setValue(locationDictionary)
}
}
//////////////////////
if Auth.auth().currentUser != nil {
self.performSegue(withIdentifier: "tohome", sender: nil)
}
}
Update: This is how I login and register.
@IBAction func RegisterPressed(_ sender: Any) {
Auth.auth().createUser(withEmail: (emailField.text ?? ""), password: (passwordField.text ?? "")) { (user, error) in
if let _eror = error {
//something bad happning
print(_eror.localizedDescription )
let alert = UIAlertController(title: "Error", message: "Invalid Entry or Duplicate.", preferredStyle: UIAlertController.Style.alert)
let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}else{
//user registered successfully
print(user as Any)
if let userID = user?.user.uid
{
KeychainWrapper.standard.set((userID), forKey: "uid")
let databaseRef = Database.database().reference()
databaseRef.child("A1").child(userID).child("users").setValue(self.emailField.text!)
databaseRef.child("people").child(userID).child("postID").setValue(userID)
let components = self.emailField.text!.split(separator: "@")
let child1 = components[0] //will be jake
let child2 = components[1] //will be aol.com
print(components, child1, child2, "childs")
databaseRef.child("people").child(userID).child("e2").setValue(child2)
components.forEach { print($0) }
self.performSegue(withIdentifier: "tohome", sender: nil)
}
}
}
}
@IBAction func loginInPressed(_ sender: Any) {
Auth.auth().signIn(withEmail: (emailField.text ?? ""), password: (passwordField.text ?? "")) { (user, error) in
if let _eror = error {
//something bad happning
print(_eror.localizedDescription )
let alert = UIAlertController(title: "Error", message: "Incorrect Email or Password.", preferredStyle: UIAlertController.Style.alert)
let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}else{
//user registered successfully
print(user as Any)
if let userID = user?.user.uid
{
KeychainWrapper.standard.set((userID), forKey: "uid")
self.performSegue(withIdentifier: "tohome", sender: nil) }
}
}
}
If I understand it correctly in viewDidAppear(_:)
you have one condition. If it's true
you immediately trying to perform the segue.
if Auth.auth().currentUser != nil {
self.performSegue(withIdentifier: "tohome", sender: nil)
}
As location is must to move into HomeScreen
, why don't you do the navigation( segue
) when you receive the first location update inside CLLocationManagerDelegate
?
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// check for existing location if we received earlier
guard self.latestLoc == nil else {
// we received one location earlier, navigation to Home completed. no need to proceed
// If we no longer need to listen for loc updates, we can stop listening further
manager.stopUpdatingLocation()
return
}
// ... Your exiting data base update code
guard let latestLoc = locations.last else { return }
self.latestLoc = latestLoc // If you want to pass this location to destination view controller in `prepare(for: UIStoryboardSegue, sender: Any?)`
// Also it will good practice to call manager.stopUpdatingLocation() if you need location only for once
// Now move to HomeScreen
self.performSegue(withIdentifier: "tohome", sender: nil)
// If we no longer need to listen for loc updates, we can stop listening further
manager.stopUpdatingLocation()
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.