2017-10-31 4 views
1

Ich folge Google Places API for IOS Tutorial, um den aktuellen Benutzer anzuzeigen.Google places API funktioniert nicht wie erwartet

verwendete ich den gleichen Code in das Tutorial wie folgt:

var placesClient: GMSPlacesClient! 

// Add a pair of UILabels in Interface Builder, and connect the outlets to these variables. 
@IBOutlet weak var nameLabel: UILabel! 

@IBOutlet weak var addressLabel: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    placesClient = GMSPlacesClient.shared() 
} 

// Add a UIButton in Interface Builder, and connect the action to this function. 
@IBAction func getCurrentPlace(_ sender: UIButton) { 

placesClient.currentPlace(callback: { (placeLikelihoodList, error) -> Void in 
    if let error = error { 
     print("Pick Place error: \(error.localizedDescription)") 
     return 
    } 

    self.nameLabel.text = "No current place" 
    self.addressLabel.text = "" 

    if let placeLikelihoodList = placeLikelihoodList { 
     let place = placeLikelihoodList.likelihoods.first?.place 
     if let place = place { 
      self.nameLabel.text = place.name 
      self.addressLabel.text = place.formattedAddress?.components(separatedBy: ", ") 
       .joined(separator: "\n") 
     } 
    } 
}) 
} 

Aber ich bekomme die folgende Fehlermeldung in der Konsole:

Pick Place error: The operation couldn’t be completed. The Places API could not find the user's location. This may be because the user has not allowed the application to access location information.

HINWEIS: Ich habe den NSLocationWhenInUseUsageDescription Schlüssel (Privacy-Set - Standort bei Verwendung Beschreibung) in Datei.

Es ist verwirrend, weil ich das Tutorial Schritt für Schritt folgte. Und testen Sie die Anwendung mit einem physischen Gerät mit aktivierten "Standortdienste".

Irgendeine Idee, was ich falsch machen könnte?

Oder liegt es daran, dass die Dokumentation nicht auf dem neuesten Stand ist?

+0

Haben Sie aufgefordert, Benutzer für die Nutzung Authorization Standort? – PGDev

+0

@PGDev wo sollte ich den Code setzen lassen locateManager = CLLocationManager(); locationManager.requestWhenInUseAuthorization(); ?Ich habe versucht, in ViewDidLoad und nichts erschien, versuchte ich in der Taste, wenn es gedrückt wird, erscheint es für weniger als eine Sekunde und verschwinden ohne etwas zu drücken. –

+0

Ich habe die Antwort aktualisiert. – PGDev

Antwort

2

This may be because the user has not allowed the application to access location information.

Dies weist Sie auf Ihre Antwort hin. Damit Google Places funktioniert, müssen Sie die Standortdienste anfordern, indem Sie requestWhenInUseAuthorization() anrufen. Dadurch wird der Benutzer aufgefordert, der App die Berechtigung zur Verwendung von Standortdiensten zu erteilen.

Weitere Informationen finden Sie unter Apple Docs.

EDIT

Sie einen starken Hinweis auf die CLLocationManager halten sollte, die Sie erstellen, damit es nicht, wenn Ausfahrten Ihre Funktion freigegeben erhalten.

"Create an instance of the CLLocationManager class and store a strong reference to it somewhere in your app. Keeping a strong reference to the location manager object is required until all tasks involving that object are complete. Because most location manager tasks run asynchronously, storing your location manager in a local variable is insufficient."

aus dem Beispiel

class LocationViewController: UIViewController, CLLocationManagerDelegate { 
    let locationManager = CLLocationManager() 

    override func viewDidLoad() 
    { 
    super.viewDidLoad() 

    locationManager.delegate = self 
    if CLLocationManager.authorizationStatus() == .notDetermined 
    { 
     locationManager.requestWhenInUseAuthorization() 
    } 
    } 
} 

CLLocationManager Docs Genommen

+0

Wo sollte ich den Code setzen lassen locateManager = CLLocationManager(); locationManager.requestWhenInUseAuthorization(); ? Ich habe versucht, in ViewDidLoad und nichts erschien, versuchte ich in der Taste, wenn es gedrückt wird, erscheint es für weniger als eine Sekunde und verschwinden ohne etwas zu drücken. –

+0

Sie müssen einen starken Verweis auf Ihren Standortmanager speichern, damit die Freigabe nicht aufgehoben wird, wenn viewDidLoad beendet wird. Ich habe meine Antwort aktualisiert –

+0

es hat funktioniert, danke für die Ausarbeitung sowie –

0

1. anfordern Benutzer für Standort Nutzungsberechtigung

requestWhenInUseAuthorization() OR requestAlwaysAuthorization() nach Ihrer Anforderung.

2. In Info.plist, fügen Sie die folgenden Schlüssel:

ein. NSLocationAlwaysUsageDescription ODER

b. NSLocationAlwaysAndWhenInUseUsageDescription

Beispiel:

class ViewController: UIViewController, CLLocationManagerDelegate 
{ 
    let locationManager = CLLocationManager() 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     locationManager.requestWhenInUseAuthorization() 
     locationManager.delegate = self 
     locationManager.startUpdatingLocation() 
    } 

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) 
    { 

    } 
}