2014-06-05 15 views
25

Próbowałem uruchomić to na chwilę teraz, a ja przyszedłem tutaj, aby zapytać - w jaki sposób mogę używać metod CLLocationManagerDelegate w Swift? Wrzuciłem to na szczycie mojej klasy:Implementacja CLLocationManagerDelegate metody w Swift

var locationManager = CLLocationManager() 

Mam umieścić następujące do mojego viewDidLoad metody:

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

I Próbowałem za pomocą tych metod delegata z bezskutecznie:

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

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

Próbowałem również używać @optional przed funkcjami, ale Xcode wyrzuca błąd kompilatora. Jakieś pomysły?

+0

Wydaje się, że działa dla mnie z Twoim kodem, czy pojawi się okno dialogowe z zapytaniem, czy Twoja aplikacja może użyć Twojej lokalizacji? – voidref

+0

@voidref Teraz, gdy o tym wspomnisz, nie otrzymuję okna dialogowego. To trochę dziwne ... Właśnie sprawdziłem ustawienia i aplikacja otrzymała również pozwolenie na dostęp do lokalizacji. –

Odpowiedz

57

Trzeba dodać klucz NSLocationAlwaysUsageDescription lub NSLocationWhenInUseUsageDescription do plist, jeśli jeszcze go nie masz, są teraz obowiązkowe,


systemów iOS 8 + wymaga jednego z tych dwóch ciągów być skonfigurowany do korzystania lokalizacje. To, którego używasz zależy od tego, jak zamierzasz poprosić o lokalizację.

  • Zastosowanie NSLocationAlwaysUsageDescription dla aplikacji, które chcą wykorzystać lokalizację urządzenia, nawet gdy aplikacja nie jest otwarty i używany.

  • Użyj aplikacji NSLocationWhenInUseUsageDescription dla aplikacji, które chcą używać lokalizacji urządzenia tylko wtedy, gdy aplikacja jest otwarta i używana.

Uwaga: Po dodaniu sznurki, zanim zbudować i uruchomić, należy usunąć aplikację, wyłączyć urządzenie i pozwolić mu zrobić nową instalację. Wygląda na to, że jeśli aplikacja była uprawniona do korzystania z lokalizacji przed uaktualnieniem do iOS8, nie prosi o ponowne pozwolenie i nie widzi, że ustawiłeś te ciągi. Wykonanie instalacji usuwania i czyszczenia rozwiązuje to.

Ustawianie albo strun skłania pop up na zainstalowanie/pierwsze użycie wzdłuż linii: „Zezwalaj«ThisApp»w celu uzyskania dostępu do lokalizacji, nawet jeśli nie są przy użyciu aplikacji”

Oto Zrzut pliku plist.

enter image description here

+0

[Masz na myśli to] (http://imgur.com/5CA1tKK)? To nie spowodowało pojawienia się okna dialogowego. –

+1

Nie, najwyraźniej iOS8 wymaga ustawienia jednego z tych dwóch łańcuchów (zobacz moją edycję). To, którego używasz, powinno być oparte na tym, w jaki sposób zamierzasz poprosić o lokalizację z tego, co rozumiem, ale nie mogłem znaleźć żadnych bardziej szczegółowych informacji. W interesie pełnego ujawnienia nadal nie pracowałem nawet po dodaniu strun, jak pokazano (mój problem wydaje się być gdzie indziej próbuję sprawić, że moje działa bez pośpiechu w tej chwili), chciałem tylko wspomnieć o ciągach, ponieważ są teraz wymagany. – DelightedD0D

+0

również, po dodaniu ciągów, przed rozpoczęciem kompilacji i uruchomieniem usuń aplikację z urządzenia i pozwól jej wykonać nową instalację. Wygląda na to, że jeśli aplikacja była uprawniona do korzystania z lokalizacji przed uaktualnieniem do iOS8, nie prosi o ponowne pozwolenie i nie widzi, że ustawiłeś te ciągi. Wykonanie instalacji usuwającej i czyszczącej rozwiązało to dla mnie, w końcu znowu działa! – DelightedD0D

3

miałem ten sam problem. didUpdateLocations - nie działa. Uruchom swoją aplikację. Przejdź do strony Ustawienia -> Prywatność -> Lokalizacja i wyłącz Usługi lokalizacyjne. didFailWithError wykryje błąd związany z nieobecnymi usługami lokalizacyjnymi. Następnie włącz go. Od tego momentu usługaUpdateLocations będzie przechwytywać lokalizacje.

+0

To zdaje się działać raz, ale kiedy ponownie uruchomię aplikację z Xcode, wracam do nie otrzymywania aktualizacji lokalizacji. – FiddleMeRagged

+1

Tak, wiem. Ale myślę, że to jest problem z XCode 6. Pozwala czekać beta 2 :) – salty

5

Najpierw dodaj dwie linie w pliku 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)") 
     } 
} 
4

Aby uzyskać użytkownika Aktualna lokalizacja: -

Krok 1:let locationManager = CLLocationManager() // make object of CLLocationManager class.

Krok 2:In viewDidLoad instantiate the CLLocationManager class like,

// Do stosowania w tle

self.locationManager.requestAlwaysAuthorization() 

// For use in foreground 

self.locationManager.requestWhenInUseAuthorization() 

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

Krok 3: Teraz wdrożenie metod delegat CLLocationManager

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

    var locValue:CLLocationCoordinate2D = manager.location.coordinate 

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

    } 

Krok 4: Nie zapomnij dodać NSLocationAlwaysUsageDescription w pliku Info.plist, podobnie jak w systemie iOS 8, konieczne jest dodanie tego. To poprosi o pozwolenie na wykorzystanie lokalizacji użytkownika.

0

To jest trochę stary wątek, ale żaden z powyższych nie działał dla mnie na Swift 2.2 xCode 7.3.1.

Problem używałem:

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

I to nigdy nie dzwonił. Po zmianie na:

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

Wszystko się udało. Wygląda na to, że delegat nie jest wywoływany podczas korzystania z [AnyObject]

Powiązane problemy