623 Stimmen

Standortdienste funktionieren nicht in iOS 8

Meine App, die mit iOS 7 einwandfrei funktionierte, funktioniert nicht mit dem iOS 8 SDK.

CLLocationManager liefert keinen Standort zurück, und ich sehe meine App auch nicht unter Einstellungen -> Ortungsdienste. Ich habe bei Google nach dem Problem gesucht, aber es kam nichts heraus. Was könnte falsch sein?

2voto

Ich erhalte einen ähnlichen Fehler in iOS 9 (Arbeiten mit Xcode 7 und Swift 2):

Versuch, MapKit-Standortupdates zu starten, ohne um Standortgenehmigung zu bitten. Muss zuerst -[CLLocationManager requestWhenInUseAuthorization] oder -[CLLocationManager requestAlwaysAuthorization] aufrufen.

Ich folgte einem Tutorial, aber der Tutor verwendete iOS 8 und Swift 1.2. Es gibt einige Änderungen in Xcode 7 und Swift 2. Ich habe diesen Code gefunden und er funktioniert gut für mich:

import UIKit
import MapKit
import CoreLocation

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    // MARK: Properties
    @IBOutlet weak var mapView: MKMapView!

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()
        self.mapView.showsUserLocation = true

    }

    // MARK: - Location Delegate Methods

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location = locations.last
        let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 1, longitudeDelta: 1))
        self.mapView.setRegion(region, animated: true)
    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        print("Fehler: " + error.localizedDescription)
    }
}

Zuletzt habe ich das in die info.plist eingefügt: Information Property List: NSLocationWhenInUseUsageDescription Value: App benötigt Standortserver für Personal

2voto

Vinoth Vino Punkte 8223

Um auf den Standort des Benutzers in iOS zuzugreifen, müssen Sie zwei Schlüssel hinzufügen,

NSLocationWhenInUseUsageDescription

NSLocationAlwaysUsageDescription

in die Info.plist-Datei.

    NSLocationWhenInUseUsageDescription
    Weil ich wissen möchte, wo du bist!
    NSLocationAlwaysUsageDescription
    Möchte wissen, wo du bist!

Siehe das untenstehende Bild.

Info.plist image

2voto

Ein kleiner Helfer für alle von euch, die mehr als eine Info.plist-Datei haben...

find . -name Info.plist | xargs -I {} /usr/libexec/PlistBuddy -c 'Add NSLocationWhenInUseUsageDescription string' {} 

Es wird das benötigte Tag zu allen Info.plist-Dateien im aktuellen Verzeichnis (und Unterordnern) hinzufügen.

Ein weiterer Befehl ist:

find . -name Info.plist | xargs -I {} /usr/libexec/PlistBuddy -c 'Set NSLocationWhenInUseUsageDescription $YOURDESCRIPTION' {} 

Es wird deine Beschreibung zu allen Dateien hinzufügen.

1voto

juan Isaza Punkte 3023
  1. Fügen Sie den Schlüssel NSLocationWhenInUseUsageDescription oder NSLocationAlwaysUsageDescription (Hintergrund-GPS-Nutzung) mit einem String zur Nutzung des GPS in jedem info.plist von jedem Ziel hinzu.

  2. Fragen Sie um Erlaubnis, indem Sie folgendes ausführen:

    [self initLocationManager:locationManager];

Wo initLocationManager ist:

// fragt nach GPS-Berechtigung unter iOS 8
-(void) initLocationManager:(CLLocationManager *) locationManager{

    locationManager = [[CLLocationManager alloc]init];

    if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
        [locationManager requestAlwaysAuthorization];
}

Denken Sie daran, dass wenn die Schlüssel nicht in jedem info.plist für jedes Ziel vorhanden sind, die App den Benutzer nicht fragen wird. Das if stellt die Kompatibilität mit iOS 7 sicher und die Methode respondsToSelector: garantiert zukünftige Kompatibilität anstatt das Problem nur für iOS 7 und 8 zu lösen.

0voto

Lorenzo Punkte 1255

Das Problem für mich war, dass die Klasse, die CLLocationManagerDelegate war, privat war, was verhinderte, dass alle Delegate-Methoden aufgerufen wurden. Ich vermute, dass es keine sehr übliche Situation ist, aber ich dachte, ich würde es erwähnen, falls es jemandem hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X