Подтвердить что ты не робот

Внедрить методы CLLocationManagerDelegate в Swift

Я пытаюсь заставить это работать некоторое время, и я пришел сюда, чтобы спросить: как мне заняться использованием методов CLLocationManagerDelegate в Swift? Я поставил это на вершине своего класса:

var locationManager = CLLocationManager()

Я поместил следующее в мой метод viewDidLoad:

locationManager.delegate = self
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()

И я попытался использовать эти методы делегата безрезультатно:

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
    locationReceived = true
}

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
    locationReceived = false
}

Я также пытался использовать @optional перед функциями, но Xcode затем выдает ошибку компилятора. Любые идеи?

4b9b3361

Ответ 1

Вам нужно добавить ключ NSLocationAlwaysUsageDescription или NSLocationWhenInUseUsageDescription к вашему plist, если вы еще этого не сделали, теперь они обязательны,


iOS8 + требует, чтобы одна из этих двух строк была настроена на использование местоположений. Какой из них вы используете, зависит от того, как вы собираетесь запрашивать местоположение.

  • Используйте NSLocationAlwaysUsageDescription для приложений, которые хотят использовать местоположение устройства, даже если приложение не открыто и не используется.

  • Используйте NSLocationWhenInUseUsageDescription для приложений, которые хотят использовать местоположение устройства, только когда приложение открыто и используется.

Примечание.. Когда вы добавляете строки, прежде чем создавать и запускать, удалите приложение с устройства и дайте ему сделать новую установку. Похоже, что если приложению было разрешено использовать местоположения до того, как вы перешли на iOS8, он не попросит вашего разрешения снова и не увидит, что вы установили эти строки. Выполнение удаления и чистой установки решает это.

Настройка любой из строк вызывает всплывающее окно при установке/первом использовании по строкам: "Разрешить" ThisApp "получать доступ к вашему местоположению, даже если вы не используете приложение"

Здесь Снимок экрана файла plist.

введите описание изображения здесь

Ответ 2

Сначала добавьте две строки в файл plist

1) NSLocationWhenInUseUsageDescription

2) NSLocationAlwaysUsageDescription

import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate

var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"

var locationManager: CLLocationManager!

override func viewDidLoad() {
    super.viewDidLoad()
}

  func initLocationManager() {
   seenError = false
   locationFixAchieved = false
    locationManager = CLLocationManager()
   locationManager.delegate = self
   locationManager.locationServicesEnabled
   locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
}

  func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
    locationManager.stopUpdatingLocation()
    if (error) {
        if (seenError == false) {
            seenError = true
           print(error)
        }
    }
}

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
    if (locationFixAchieved == false) {
        locationFixAchieved = true
        var locationArray = locations as NSArray
        var locationObj = locationArray.lastObject as CLLocation
        var coord = locationObj.coordinate

        println(coord.latitude)
        println(coord.longitude)
    }
}

 func locationManager(manager: CLLocationManager!,
    didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        var shouldIAllow = false

        switch status {
        case CLAuthorizationStatus.Restricted:
            locationStatus = "Restricted Access to location"
        case CLAuthorizationStatus.Denied:
            locationStatus = "User denied access to location"
        case CLAuthorizationStatus.NotDetermined:
            locationStatus = "Status not determined"
        default:
            locationStatus = "Allowed to location Access"
            shouldIAllow = true
        }
        NSNotificationCenter.defaultCenter().postNotificationName("LabelHasbeenUpdated", object: nil)
        if (shouldIAllow == true) {
            NSLog("Location to Allowed")
            // Start location services
            locationManager.startUpdatingLocation()
        } else {
            NSLog("Denied access: \(locationStatus)")
        }
}

Ответ 3

Чтобы получить текущее местоположение пользователя: -

Шаг 1: let locationManager = CLLocationManager() // make object of CLLocationManager class.

Шаг 2: In viewDidLoad instantiate the CLLocationManager class like,

//Для использования в фоновом режиме

self.locationManager.requestAlwaysAuthorization()

// For use in foreground

self.locationManager.requestWhenInUseAuthorization()

if (CLLocationManager.locationServicesEnabled())
{
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}

Шаг 3: Теперь реализуем методы делегата CLLocationManager

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

    var locValue:CLLocationCoordinate2D = manager.location.coordinate

    println("locations = \(locValue.latitude) \(locValue.longitude)")

  }

Шаг 4:    Не забудьте добавить NSLocationAlwaysUsageDescription в Info.plist, как в iOS 8, обязательно добавить это. Это запросит разрешение на использование местоположения пользователя.

Ответ 4

У меня была такая же проблема. didUpdateLocations - не работал. Запустите приложение. Перейдите на страницу "Настройки" → "Конфиденциальность" → "Расположение" и "Отключить службы местоположения". didFailWithError поймает ошибку об отсутствующих службах местоположения. Затем включите его. С того момента didUpdateLocations будет захватывать местоположения.

Ответ 5

Это немного старый поток, но ни один из вышеперечисленных не работал у меня в Swift 2.2 xCode 7.3.1.

Проблема заключается в том, что я использовал:

func locationManager(manager: CLLocationManager!, didUpdateLocation locations: [AnyObject]!) {
    print("Got location")
    locationManager.stopUpdatingLocation()
}

И это никогда не вызывалось. Когда я изменил на:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("Got location")
    locationManager.stopUpdatingLocation()
}

Все сложилось. Кажется, что делегат не вызывается при использовании [AnyObject]