Вопрос

Я пытался заставить это работать некоторое время, и я пришел сюда, чтобы спросить - как мне использовать методы 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 выдает ошибку компилятора.Есть какие-нибудь идеи?

Это было полезно?

Решение

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


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

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

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

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

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

Вот такой Скриншот из числа лист файл.

enter image description here

Другие советы

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

1) nslocationwheninuseUsedescription

2) nslocationaryusucedescription

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)")
        }
}
.

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

<Сильный> Шаг 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, это обязательно добавить это.Это спросит разрешения на использование местоположения пользователя.

У меня была такая же проблема.Дидупдателокации - не работали.Запустите свое приложение. Перейдите на страницу настроек -> Конфиденциальность -> Расположение и отключение служб местоположения.DidFailwitherror поймает ошибку о отсутствующих услугах местоположения.Затем включите его.С того момента дидупдателокации поймают места.

Это немного старой нити, но ни один из вышеперечисленных не работал для меня на 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]

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top