Cllocationmanagerdelegate методы, не вызываемые в Swift-коде
Я пытаюсь создать простое приложение, которое обнаруживает регион, в котором кто-то находится, но я застрял, потому что ни один из методов CLLocationManagerDelegate не вызывается, когда приложение запускается и находит местоположения.
В случае, если это актуально, я также не вижу диалогового окна с просьбой дать приложению разрешение на использование местоположения.
Вот что у меня есть до сих пор -
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var locationLabel : UILabel!
var locationManager = CLLocationManager()
let geocoder = CLGeocoder ()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
}
override func viewDidDisappear(animated: Bool) {
locationManager.stopUpdatingLocation()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
geocoder.reverseGeocodeLocation(locations.last as CLLocation, completionHandler: {(placemark, error) in
if (error != nil) {
println("Error")
} else {
let pm = placemark.first as CLPlacemark
println(pm)
}
})
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
println("Epic Fail")
}
}
Я поставил точки останова, поэтому я знаю, что код никогда не вызывается. Я вошел и вручную включил службы определения местоположения для приложение, пока оно работает, тоже.
3 ответов:
Попробуйте позвонить
func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!)Вместо вызова делегата, который вы делаете сейчас... У меня были проблемы с:
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!)Тоже. Но использование вышеупомянутого вызова делегата исправило мою проблему.
Edit (неправильно прочитал вопрос...)
Вы никогда не спрашиваете разрешения,поэтому вы не получаете всплывающее окно. Позвоните по следующему номеру::
locationManager.requestWhenInUseAuthorization()Это довольно важный шаг, и ваше приложение не будет работать, если вы не запросили у пользователя авторизацию вашего приложения
Это также важно, что вы добавляете
NSLocationWhenInUseUsageDescriptionк вашим .plist-файл при запуске iOS8.Скриншот:
Следующий ответный вопрос и ответ дали мне решение, в котором я нуждался.
Проблема авторизации CLLocationManager iOS 8
В конечном счете, если вы работаете на iOS, то вы должны добавить ключ
NSLocationAlwaysUsageDescription(при запросе данных о местоположении, которые должны быть всегда доступны)Или
NSLocationWhenInUseUsageDescription(при запросе на использование данных о местоположении только во время работы приложения)Если вы этого не сделаете, доступ к службам определения местоположения будет запрещен по умолчанию для вашего приложения и пользователю не будет предложено разрешить это.
private let loctionManager = CLLocationManager() // Here class YourViewController: ViewController { loctionManager.delegate = self loctionManager.requestWhenInUseAuthorization() } extension YourViewController: CLLocationManagerDelegate { func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { if (status == .authorizedWhenInUse) { // do something } } } .plist Property List Key: Privacy - Location When In Use Usage Description Type: String Value: Use to add a location to your rap. OR Source code <key>NSLocationWhenInUseUsageDescription</key> <string>Use to add a location to your rap.</string>

Comments