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   4  

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

    No results found.