Реализовать методы CLLocationManagerDelegate в Swift
-
21-12-2019 - |
Вопрос
Я пытался заставить это работать некоторое время, и я пришел сюда, чтобы спросить - как мне использовать методы 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, оно больше не запрашивает вашего разрешения и не видит, что вы установили эти строки.Выполнение удаления и чистой установки решает эту проблему.
Установка любой из строк вызовет всплывающее окно при установке / первом использовании примерно в следующем виде:"Разрешить "Этому приложению" доступ к вашему местоположению, даже если вы не используете приложение"
Вот такой Скриншот из числа лист файл.
Другие советы
сначала добавьте эту две строки в файле 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()
}
.
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]