How to get the user’s current location in Swift 4.2

This tutorial shows you how to get your current location (latitude and longitude) in Swift 4.2. Please note, for all iPAD users you will need a Cellular iPAD which comes with inbuilt GPS. Also, you will be able to use GPS while you have wifi and 3G/4G/5G turned off. You can find the source code at the end of the tutorial.

What does this app do?
– It will prompt you with permission to request access you location
– Your latitude and longitude coordinates will update every few seconds.

Language: Swift 4.2
Software: Xcode

 

CODE:

 

View Controller

import UIKit
import MessageUI
import CoreLocation

class ViewController: UIViewController, MFMailComposeViewControllerDelegate, CLLocationManagerDelegate {
    
    @IBOutlet weak var lat: UITextField!
    
    @IBOutlet weak var long: UITextField!
    
    
    // Used to start getting the users location
    let locationManager = CLLocationManager()
    var timer = Timer()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager.delegate = self

        // For use when the app is open
        locationManager.requestWhenInUseAuthorization()
        
        // If location services is enabled get the users location
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest // You can change the locaiton accuary here.
        locationManager.startUpdatingLocation()
        
        var latitude: Double? {
            if let text = lat.text {
                return Double(text)
            } else {
                return nil
            }
        }
        
        var longitude: Double? {
            if let text = long.text {
                return Double(text)
            } else {
                return nil
            }
        }
        
        timer.invalidate()   // just in case you had existing `Timer`, `invalidate` it before we lose our reference to it
        timer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) { [weak self] _ in
            
        }
        
    }
    
    // Print out the location to the console
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.first {
            //print(location.coordinate.latitude)
            self.lat.text = "\(location.coordinate.latitude)"
            self.long.text = "\(location.coordinate.longitude)"
        }
    }
    
    // If we have been deined access give the user the option to change it
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if(status == CLAuthorizationStatus.denied) {
            showLocationDisabledPopUp()
        }
    }
    
    // Show the popup to the user if we have been denied access
    func showLocationDisabledPopUp() {
        let alertController = UIAlertController(title: "Background Location Access Disabled",
                                                message: "In order to submit offline report you need to enable your location services.",
                                                preferredStyle: .alert)
        
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        alertController.addAction(cancelAction)
        
        let openAction = UIAlertAction(title: "Open Settings", style: .default) { (action) in
            if let url = URL(string: UIApplication.openSettingsURLString) {
                UIApplication.shared.open(url, options: convertToUIApplicationOpenExternalURLOptionsKeyDictionary([:]), completionHandler: nil)
                
            }
        }
        alertController.addAction(openAction)
        
        self.present(alertController, animated: true, completion: nil)
    }
    
    func grabit() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation();
        
        print(self.lat.text ?? 0)
        print(self.long.text ?? 0)
}
    
    override func viewDidAppear(_ animated: Bool) {
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToUIApplicationOpenExternalURLOptionsKeyDictionary(_ input: [String: Any]) -> [UIApplication.OpenExternalURLOptionsKey: Any] {
    return Dictionary(uniqueKeysWithValues: input.map { key, value in (UIApplication.OpenExternalURLOptionsKey(rawValue: key), value)})
}

Screenshots:

 

 

 

Source code:

Click to download