Search code examples
swiftfirebasefirebase-authenticationgmsmapview

Googlemaps not allowing me to locate the users location?


I am trying to create a view controller on swift that shows where the user is located. I have already implemented google maps, so now all I have to do is plug in the correct code. When doing so, I keep getting these two error messages then the app crashes. Can someone help me with figuring out a solution> any and all help is appreciated.

import UIKit
import Foundation
import Firebase
import MapKit
import GoogleMaps
import CoreLocation

class mainViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    let defaults = UserDefaults.standard
    let locationManager = CLLocationManager()
    var mapView = GMSMapView()
    var camera = GMSCameraPosition()


    override func viewDidLoad() {
        super.viewDidLoad()

        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()

        GMSServices.provideAPIKey("AIzaSyBDOLisA3c-wDTbkbSssAxEb3iLw7Y5vHo")

        let camera = GMSCameraPosition.camera(withLatitude: (self.locationManager.location?.coordinate.latitude)!, longitude: (self.locationManager.location?.coordinate.latitude)!, zoom: 17)
        let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
        view = mapView

        let marker = GMSMarker()
        marker.position = CLLocationCoordinate2D(latitude: (self.locationManager.location?.coordinate.latitude)!, longitude: (self.locationManager.location?.coordinate.latitude)!)
        marker.snippet = "Current Location"
        marker.map = mapView
        self.mapView.addSubview(mapView)

        view.backgroundColor = GREEN_Theme
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.title = "Welcome"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Logout", style: .plain, target: self, action: #selector(Logout))
        }
    @objc func Logout() {
        print("Logged Out")
        do {

// I am receiving this error message on the auth.auth().signOut() "Use of unresolved identifier 'Auth'"
            try  Auth.auth().signOut()
            defaults.set(false, forKey: "user is logged in")
            let loginController = UINavigationController(rootViewController: LoginController())
            present(loginController, animated: true, completion: nil)
        } catch let err {
            print(err.localizedDescription)
        }

    }
}

Solution

  • Your issue is that the CLLocationManager does not have enough time to fetch the info and in the meantime other functions ask for that info which its still nil.

    The below will take care the issue, it also stops updating the locations all the time which can be battery draining especially considering that you have set AccuracyBest.

    func getLocation(){
        locationManager=CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
        let lastLocation=locations[locations.count-1]
        if lastLocation.horizontalAccuracy>0{
            locationManager.stopUpdatingLocation()
            let latitude = lastLocation.coordinate.latitude
            let longitude = lastLocation.coordinate.longitude
    
            GMSServices.provideAPIKey("AIzaSyBDOLisA3c-wDTbkbSssAxEb3iLw7Y5vHo")
    // everything that is going to require the latitude and longitude from the location manager goes here
            let camera = GMSCameraPosition.camera(withLatitude: (self.locationManager.location?.coordinate.latitude)!, longitude: (self.locationManager.location?.coordinate.latitude)!, zoom: 17)
            let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
            self.view = mapView
    
            let marker = GMSMarker()
             marker.position = CLLocationCoordinate2D(latitude: (self.locationManager.location?.coordinate.latitude)!, longitude: (self.locationManager.location?.coordinate.latitude)!)
             marker.snippet = "Current Location"
             marker.map = mapView
             self.mapView.addSubview(mapView)
          }
     }
    

    Your viewDidLoad should have:

     override func viewDidLoad() {
        super.viewDidLoad()
    
        getLocation()
    
        view.backgroundColor = GREEN_Theme
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.title = "Welcome"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Logout", style: .plain, target: self, action: #selector(Logout))
        }