Reputation: 1108
I am using iOS SDK 8.1 trying to call requestWhenInUseAuthorization() method to prompt user to grant access to my app. I imported CoreLocation.framework, and added NSLocationWhenInUseUsageDescription and NSLocationAlwaysUsageDescription keys into info.plist. When I ran the app, it never prompted me for location access. Below is my code, what have I missed?
import UIKit
import CoreLocation
import MapKit
class ViewController: UIViewController, CLLocationManagerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
var manager = CLLocationManager()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
let authorizationStatus = CLLocationManager.authorizationStatus()
switch authorizationStatus {
case .Authorized:
println("authorized")
case .AuthorizedWhenInUse:
println("authorized when in use")
case .Denied:
println("denied")
case .NotDetermined:
println("not determined")
case .Restricted:
println("restricted")
}
manager.requestWhenInUseAuthorization()
manager.startUpdatingLocation()
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
let location = locations[0] as CLLocation
println("Latitude: \(location.coordinate.latitude). Longitude: \(location.coordinate.longitude).")
}
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
switch status {
case .Authorized:
println("authorized")
case .AuthorizedWhenInUse:
println("authorized when in use")
case .Denied:
println("denied")
case .NotDetermined:
println("not determined")
case .Restricted:
println("restricted")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
The console only showed "not determined" once and nothing else. So I went to iPhone Simulator => Settings => Privacy => Location => My App. It showed me 3 options: "Never", "While Using the App", "Always". But nothing was selected.
Upvotes: 4
Views: 9357
Reputation: 483
Setting these properties in the viewWillAppear instead of the viewDidLoad fixed it for me, thanks!
override func viewWillAppear(animated: Bool) {
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
Upvotes: 1
Reputation: 14294
I also faced the same problem. I have added two keys together in info.plist.
NSLocationWhenInUseUsageDescription key is supported in iOS 8.0 and later. If your Info.plist file includes both this key and the NSLocationUsageDescription key, the system uses this key and ignores the NSLocationUsageDescription key.
Rearranged the code:
let locationManager: CLLocationManager = CLLocationManager()
let authorizationStatus = CLLocationManager.authorizationStatus()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
if(authorizationStatus == .Denied)
{
print("DENIED")
locationManager.requestWhenInUseAuthorization()
}
}
override func viewWillAppear(animated: Bool) {
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
Clean the project and run again.
Upvotes: 0
Reputation: 1108
Problem solved. My manager
was declared as local var inside viewDidLoad()
method, but it should've been a class level property.
After I moved manager
declaration out of viewDidLoad()
, my app worked.
Not sure how exactly manager.requestWhenInUseAuthorization()
work behind the scene and why exactly manager
defined within viewDidLoad()
not work. Hope someone who knows this detail enlighten me.
Upvotes: 21