CoreLocation Swift

623 views Asked by At

I've added the CoreLocation Library, along with NSLocationWhenInUseUsageDescription to info.plist but when I compile and run, it does not display the current location or prompt the user to allow access to current location. I currently have the following below, but it just displays the entire US. and

The authorization status of location services is changed to: Not determined

is printed to the log, but I'm not being prompted to allow access to current location nor am I receiving the alert. I tried following the logic and flowchart here: Xcode warning when using MapKit and CoreLocation but it didn't work.

import UIKit
import MapKit
import CoreLocation

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate{

var loadPoints:[Int: MapPointAnnotation] = [Int:MapPointAnnotation]()
var map:MKMapView?
var loads: [Load]?
var rightButton: UIButton?
var selectedLoad:Load?
var manager:CLLocationManager!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


   // Core Location
    manager = CLLocationManager()
    manager.delegate = self
}


func locationManager(manager: CLLocationManager!,
    didChangeAuthorizationStatus status: CLAuthorizationStatus){

        print("The authorization status of location " +
            "services is changed to: ")

        switch CLLocationManager.authorizationStatus(){
        case .Denied:
            println("Denied")
        case .NotDetermined:
            println("Not determined")
        case .Restricted:
            println("Restricted")
        default:
            println("Authorized")
        }

}

func displayAlertWithTitle(title: String, message: String){
    let controller = UIAlertController(title: title,
        message: message,
        preferredStyle: .Alert)

    controller.addAction(UIAlertAction(title: "OK",
        style: .Default,
        handler: nil))

    presentViewController(controller, animated: true, completion: nil)

}
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    if CLLocationManager.locationServicesEnabled(){

        switch CLLocationManager.authorizationStatus(){
        case .Denied:
            displayAlertWithTitle("Not Determined",
                message: "Location services are not allowed for this app")
        case .NotDetermined:
            manager = CLLocationManager()
            if let locationManager = self.manager{
                locationManager.delegate = self
                locationManager.requestWhenInUseAuthorization()
            }
        case .Restricted:
            displayAlertWithTitle("Restricted",
                message: "Location services are not allowed for this app")
        default:
            println("Default")
        }

    } else {

        println("Location services aren't enabled")
    }

}

convenience init(frame:CGRect){
    self.init(nibName: nil, bundle: nil)
    self.view.frame = frame

    NSNotificationCenter.defaultCenter().addObserver(self, selector:"selectAnnotation:", name: "selectAnnotation", object: nil)

    self.map = MKMapView(frame: frame)
    self.map!.delegate = self

    self.view.addSubview(self.map!)
}

func locationManager(manager:CLLocationManager, didUpdateLocations locations:[AnyObject]) {

    var userLocation:CLLocation = locations[0] as! CLLocation
    var latitude:CLLocationDegrees = userLocation.coordinate.latitude
    var longitude:CLLocationDegrees = userLocation.coordinate.longitude
    var latDelta:CLLocationDegrees = 1.0
    var lonDelta:CLLocationDegrees = 1.0

    var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)
    var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
    var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)
    map!.setRegion(region, animated: true)

}

enter image description here enter image description here enter image description here

1

There are 1 answers

8
Leo On BEST ANSWER

First,make sure you have this key in plist enter image description here

Second,request location service in viewDidLoad,I test with these code

import UIKit
import CoreLocation

class ViewController: UIViewController,CLLocationManagerDelegate {
var manager:CLLocationManager!
override func viewDidLoad() {
    super.viewDidLoad()
    manager = CLLocationManager()
    manager.delegate = self
    if(NSString(string:UIDevice.currentDevice().systemVersion).doubleValue >= 8.0){
        manager.requestWhenInUseAuthorization()
    }
    // Do any additional setup after loading the view, typically from a nib.
}
func locationManager(manager: CLLocationManager!,
    didChangeAuthorizationStatus status: CLAuthorizationStatus){
        
        print("The authorization status of location " +
            "services is changed to: ")
        
        switch CLLocationManager.authorizationStatus(){
        case .Denied:
            println("Denied")
        case .NotDetermined:
            println("Not determined")
        case .Restricted:
            println("Restricted")
        default:
            println("Authorized")
        }
        
}

And get output enter image description here

You have to run this on device and if you can not get alert,try uninstall the app,then run again