2016-07-10 20 views
1

Beim Versuch, den Längen- und Breitengrad eines Benutzers in Swift zu ermitteln, bin ich auf ein Problem gestoßen. Ich habe eine Schaltfläche, die eine Funktion ausführt, um die Koordinaten des Benutzers zu erhalten, beim ersten Drücken sollte es um Erlaubnis bitten, der App Ihren Standort zu geben. Aber das Problem, das ich habe, ist, dass dieses Popup automatisch geschlossen wird, direkt nachdem ich die Schaltfläche "Standort abrufen" gedrückt habe.Swift: Popup mit der Popup-Berechtigung bleibt geschlossen

Hier ist, was passiert: http://imgur.com/a/0wdnm

Hier ist mein Code:

class location: NSObject, CLLocationManagerDelegate { 
var locationManager = CLLocationManager() 

internal func getLocation() { 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 

    if CLLocationManager.authorizationStatus() == .AuthorizedAlways { 
     locationManager.startUpdatingLocation() 
    } else if CLLocationManager.authorizationStatus() == .NotDetermined { 
     locationManager.requestAlwaysAuthorization() 
    } else if CLLocationManager.authorizationStatus() == .Denied { 
     print("User denied location permissions.") 
    } 
} 


// MARK : CLLocationManagerDelegate protocol 
@objc 
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    let location: CLLocationCoordinate2D = (locationManager.location?.coordinate)! 
    print(location.latitude) 
    print(location.longitude) 
    } 
} 
+1

Bitte zeigen Sie den Code, wo Sie Ihre 'location' Klasseninstanz zuordnen. Es klingt wie es veröffentlicht wird, wenn es für die Dauer Ihrer App bleiben soll. Sie sollten darüber nachdenken, es zu einem Singleton – Paulw11

+0

Ich liebe dich, @ Paulw11 – inigo333

Antwort

0

Hier einige Code, der für mich arbeitet. Einige Dinge zur Kenntnis zu nehmen:

  1. Erstellen Sie nur ein CLLocationManager, wenn Sie es tatsächlich verwenden müssen. Wenn der Benutzer CoreLocation nicht aktiviert hat, erhalten die Benutzer beim Erstellen des Standortmanagers eine Warnmeldung, z. B. beim Start Ihrer App (die möglicherweise nicht Ihren Vorstellungen entspricht).
  2. requestAlwaysAuthorization erfordert einen Eintrag [NSLocationAlwaysUsageDescription][1] in Info.plist.
  3. Beobachten Sie locationManager:didChangeAuthorizationStatus: und stoppen Sie den Standortmanager, wenn die Dienste nicht mehr verfügbar sind.

Code:

import UIKit 
import CoreLocation 

class LocationViewController: UIViewController, CLLocationManagerDelegate { 

    var locationManager: CLLocationManager? 

    internal func getLocation() { 

     if locationManager == nil { 

      locationManager = CLLocationManager() 
      locationManager?.delegate = self 
      locationManager?.desiredAccuracy = kCLLocationAccuracyBest 
     } 

     if CLLocationManager.authorizationStatus() == .AuthorizedAlways { 
      locationManager?.startUpdatingLocation() 
     } else if CLLocationManager.authorizationStatus() == .NotDetermined { 
      locationManager?.requestAlwaysAuthorization() 
     } else if CLLocationManager.authorizationStatus() == .Denied { 
      print("User denied location permissions.") 
     } 
    } 


    // MARK : CLLocationManagerDelegate protocol 

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 

     switch status { 

     case .AuthorizedAlways, .AuthorizedWhenInUse: 
      locationManager?.startUpdatingLocation() 

     default: 
      locationManager?.stopUpdatingLocation() 
     } 
    } 

    @objc func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     guard let location = locationManager?.location?.coordinate else { 
      return 
     } 

     print(location.latitude) 
     print(location.longitude) 
    } 
} 

extension LocationViewController { 

    @IBAction internal func buttonTapped(sender: AnyObject) { 

     getLocation() 
    } 
} 
+0

Selbst nach dem Versuch, Ihren Code, habe ich immer noch das gleiche Problem. –

0

wenn Standort Erlaubnis Popup erscheinen sollten Sie nicht Standort zugreifen anymore.You nur für Benutzer die Berechtigung warten müssen als halten ortsbezogenen Funktionen verwenden.