it-swarm.com.de

Ortungsdienste funktionieren unter iOS 8 nicht

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

CLLocationManager gibt keinen Standort zurück und ich sehe meine App auch nicht unter Einstellungen -> Standortdienste. Ich habe eine Google-Suche zu diesem Thema durchgeführt, aber es ist nichts aufgetaucht. Was könnte falsch sein?

605
özg

Ich habe mein eigenes Problem gelöst.

Offensichtlich ist in iOS 8 SDK requestAlwaysAuthorization (für Hintergrundstandort) oder requestWhenInUseAuthorization (Standort nur im Vordergrund) ein Aufruf von CLLocationManager erforderlich, bevor die Standortaktualisierung gestartet wird.

Es muss auch NSLocationAlwaysUsageDescription oder NSLocationWhenInUseUsageDescription geben Sie Info.plist mit einer Meldung in der Eingabeaufforderung angezeigt werden. Das Hinzufügen dieser löste mein Problem.

enter image description here

Hoffe es hilft jemand anderem.

BEARBEITEN: Weitere Informationen finden Sie unter: Core-Location-Manager-Änderungen-in-ios-8

1086
özg

Ich habe mir mit dem gleichen Problem die Haare ausgezogen. Xcode gibt Ihnen den Fehler:

Es wird versucht, MapKit Standortaktualisierungen zu starten, ohne zur Standortautorisierung aufzufordern. Muss zuerst -[CLLocationManager requestWhenInUseAuthorization] oder -[CLLocationManager requestAlwaysAuthorization] aufrufen.

Aber selbst wenn Sie eine der oben genannten Methoden implementieren, wird der Benutzer nur dann zur Eingabe aufgefordert, wenn in der info.plist ein Eintrag für NSLocationAlwaysUsageDescription oder NSLocationWhenInUseUsageDescription vorhanden ist.

Fügen Sie Ihrer info.plist die folgenden Zeilen hinzu, wobei die Zeichenfolgenwerte den Grund darstellen, warum Sie auf den Speicherort des Benutzers zugreifen müssen

<key>NSLocationWhenInUseUsageDescription</key>
<string>This application requires location services to work</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>This application requires location services to work</string>

Ich denke, diese Einträge fehlen möglicherweise, seit ich dieses Projekt in Xcode 5 gestartet habe. Ich vermute, Xcode 6 fügt möglicherweise Standardeinträge für diese Schlüssel hinzu, die jedoch noch nicht bestätigt wurden.

Weitere Informationen zu diesen beiden Einstellungen finden Sie hier

313
Henry

Um sicherzustellen, dass dies abwärtskompatibel mit iOS 7 ist, sollten Sie prüfen, ob der Benutzer iOS 8 oder iOS 7 ausführt. Beispiel:

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

//In ViewDidLoad
if(IS_OS_8_OR_LATER) {
   [self.locationManager requestAlwaysAuthorization];
}

[self.locationManager startUpdatingLocation];
104
JKoko
- (void)startLocationManager
{
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone; //whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingLocation];
    [locationManager requestWhenInUseAuthorization]; // Add This Line


}

Und zu deiner info.plist Datei enter image description here

50
neo D1

Nach den Apple Dokumenten:

Ab iOS 8 ist das Vorhandensein eines NSLocationWhenInUseUsageDescription oder eines NSLocationAlwaysUsageDescription Schlüsselwerts in der Info.plist-Datei Ihrer App erforderlich. Es ist dann auch erforderlich, vor der Registrierung für Standortaktualisierungen die Erlaubnis des Benutzers anzufordern, indem Sie je nach Bedarf [self.myLocationManager requestWhenInUseAuthorization] oder [self.myLocationManager requestAlwaysAuthorization] aufrufen. Der von Ihnen in die Info.plist eingegebene String wird dann im folgenden Dialog angezeigt.

Wenn der Benutzer die Erlaubnis erteilt, ist das normal. Wenn sie die Berechtigung verweigern, wird der Delegat nicht über Standortaktualisierungen informiert.

30
metatheoretic
- (void)viewDidLoad
{

    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc] init];

    self.locationManager.delegate = self;
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]){
        NSUInteger code = [CLLocationManager authorizationStatus];
        if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
            // choose one request according to your business.
            if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
                [self.locationManager requestAlwaysAuthorization];
            } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
                [self.locationManager  requestWhenInUseAuthorization];
            } else {
                NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
            }
        }
    }
    [self.locationManager startUpdatingLocation];
}

>  #pragma mark - CLLocationManagerDelegate

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
        NSLog(@"didFailWithError: %@", error);
        UIAlertView *errorAlert = [[UIAlertView alloc]
                                   initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [errorAlert show];
    }

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        NSLog(@"didUpdateToLocation: %@", newLocation);
        CLLocation *currentLocation = newLocation;

        if (currentLocation != nil) {
            longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
            latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
        }
    }

In iOS 8 müssen Sie zwei zusätzliche Schritte ausführen, um den Standort in Betrieb zu nehmen: Fügen Sie Ihrer Info.plist einen Schlüssel hinzu und fordern Sie beim Standortmanager die Autorisierung an, um ihn zu starten. Es gibt zwei Info.plist-Schlüssel für die neue Standortberechtigung. Einer oder beide dieser Schlüssel sind erforderlich. Wenn keiner der Schlüssel vorhanden ist, können Sie startUpdatingLocation aufrufen, der Standortmanager wird jedoch nicht gestartet. Es wird auch keine Fehlermeldung an den Delegaten gesendet (da es nie gestartet wurde, kann es nicht fehlschlagen). Es schlägt auch fehl, wenn Sie einen oder beide Schlüssel hinzufügen, aber vergessen, die Autorisierung explizit anzufordern. Als erstes müssen Sie einen oder beide der folgenden Schlüssel zu Ihrer Info.plist-Datei hinzufügen:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

Diese beiden Schlüssel nehmen eine Zeichenfolge

dies ist eine Beschreibung, warum Sie Ortungsdienste benötigen. Sie können eine Zeichenfolge wie „Ort ist erforderlich, um herauszufinden, wo Sie sich befinden“ eingeben, die wie in iOS 7 in der Datei InfoPlist.strings lokalisiert werden kann.

enter image description here

28
Adarsh G J

Meine Lösung, die in Xcode 5 kompiliert werden kann:

#ifdef __IPHONE_8_0
    NSUInteger code = [CLLocationManager authorizationStatus];
    if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
        // choose one request according to your business.
        if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
            [self.locationManager requestAlwaysAuthorization];
        } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
            [self.locationManager  requestWhenInUseAuthorization];
        } else {
            NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
        }
    }
#endif
    [self.locationManager startUpdatingLocation];
19
Yinfeng

Der alte Code zum Abfragen des Standorts funktioniert in iOS 8 nicht. Sie können diese Methode zur Standortautorisierung ausprobieren:

- (void)requestAlwaysAuthorization
{
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

    // If the status is denied or only granted for when in use, display an alert
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status ==        kCLAuthorizationStatusDenied) {
        NSString *title;
        title = (status == kCLAuthorizationStatusDenied) ? @"Location services are off" :   @"Background location is not enabled";
        NSString *message = @"To use background location you must turn on 'Always' in the Location Services Settings";

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                            message:message
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Settings", nil];
        [alertView show];
    }
    // The user has not enabled any location services. Request background authorization.
    else if (status == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestAlwaysAuthorization];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        // Send the user to the Settings for this app
        NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication] openURL:settingsURL];
    }
}
17
Nits007ak

In iOS 8 müssen Sie zwei zusätzliche Schritte ausführen, damit der Standort funktioniert: Fügen Sie Ihrer Info.plist einen Schlüssel hinzu und fordern Sie beim Standortmanager die Autorisierung zum Starten an

info.plist:

<key>NSLocationUsageDescription</key>
<string>I need location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>I need location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>I need location</string>

Fügen Sie dies zu Ihrem Code hinz

if (IS_OS_8_OR_LATER)
{
    [locationmanager requestWhenInUseAuthorization];

    [locationmanager requestAlwaysAuthorization];
}
12
user3133977

Ein häufiger Fehler für Swift Entwickler:

Stellen Sie zunächst sicher, dass Sie der Liste einen Wert für NSLocationWhenInUseUsageDescription oder NSLocationAlwaysUsageDescription hinzufügen.

Wenn Sie immer noch kein Fenster sehen, in dem Sie nach einer Autorisierung gefragt werden, prüfen Sie, ob Sie die Zeile var locationManager = CLLocationManager() in den View Controller einfügen viewDidLoad Methode. Wenn Sie dies tun, wird auch dann nichts angezeigt, wenn Sie locationManager.requestWhenInUseAuthorization() aufrufen. Dies liegt daran, dass nach der Ausführung von viewDidLoad die Zuordnung der locationManager-Variablen aufgehoben (gelöscht) wird.

Die Lösung besteht darin, die Zeile var locationManager = CLLocationManager() oben in der Klassenmethode zu platzieren.

11
st.derrick

Fügen Sie vor [locationManager startUpdatingLocation]; eine iOS8-Standortdienstanforderung hinzu:

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

Bearbeiten Sie den Info.plist Ihrer App und fügen Sie den Schlüssel NSLocationAlwaysUsageDescription mit dem Zeichenfolgenwert hinzu, der dem Benutzer angezeigt wird (z. B. We do our best to preserve your battery life.).

Wenn Ihre App nur Ortungsdienste benötigt, während die App geöffnet ist, ersetzen Sie Folgendes:

requestAlwaysAuthorization mit requestWhenInUseAuthorization und

NSLocationAlwaysUsageDescription mit NSLocationWhenInUseUsageDescription.

9
budidino

Ich arbeitete an einer App, die auf iOS 8 aktualisiert wurde, und die Ortungsdienste funktionierten nicht mehr. Sie werden wahrscheinlich im Debug-Bereich folgende Fehlermeldung erhalten:

Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.

Ich habe das am wenigsten aufdringliche Verfahren durchgeführt. Fügen Sie zunächst den Eintrag NSLocationAlwaysUsageDescription zu Ihrer info.plist hinzu:

Enter image description here

Beachten Sie, dass ich den Wert für diesen Schlüssel nicht ausgefüllt habe. Dies funktioniert immer noch, und ich mache mir keine Sorgen, weil dies eine In-House-App ist. Außerdem gibt es bereits einen Titel, in dem nach der Verwendung von Ortungsdiensten gefragt wird, sodass ich nichts überflüssiges tun wollte.

Als nächstes habe ich eine Bedingung für iOS 8 erstellt:

if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [_locationManager requestAlwaysAuthorization];
}

Danach wird die locationManager:didChangeAuthorizationStatus: -Methode aufgerufen:

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:  (CLAuthorizationStatus)status
{
    [self gotoCurrenLocation];
}

Und jetzt funktioniert alles gut. Lesen Sie wie immer die Dokumentation .

9
Kris Utter

Lösung mit Abwärtskompatibilität:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
    [self.locationManager respondsToSelector:requestSelector]) {
    [self.locationManager performSelector:requestSelector withObject:NULL];
} else {
    [self.locationManager startUpdatingLocation];
}

Richten Sie den NSLocationWhenInUseUsageDescription-Schlüssel in Ihrer Info.plist ein

7
hrchen

Lösung mit Abwärtskompatibilität, die keine Xcode-Warnungen erzeugt:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
  [self.locationManager respondsToSelector:requestSelector]) {
((void (*)(id, SEL))[self.locationManager methodForSelector:requestSelector])(self.locationManager, requestSelector);
  [self.locationManager startUpdatingLocation];
} else {
  [self.locationManager startUpdatingLocation];
}

Setup NSLocationWhenInUseUsageDescription Geben Sie Ihren Info.plist ein.

Für iOS Version 11.0 +: Setup NSLocationAlwaysAndWhenInUseUsageDescription Geben Sie Ihren Info.plist ein. zusammen mit anderen 2 Schlüsseln.

Dies ist ein Problem mit iOS 8 Fügen Sie dies Ihrem Code hinzu

if (IS_OS_8_OR_LATER)
{
    [locationmanager requestWhenInUseAuthorization];

    [locationmanager requestAlwaysAuthorization];
}

und zur info.plist:

 <key>NSLocationUsageDescription</key>
 <string>I need location</string>
 <key>NSLocationAlwaysUsageDescription</key>
 <string>I need location</string>
 <key>NSLocationWhenInUseUsageDescription</key>
 <string>I need location</string>
5
Pooja Patel

Um unter iOS 8 auf den Benutzerstandort zuzugreifen, müssen Sie Folgendes hinzufügen:

NSLocationAlwaysUsageDescription in the Info.plist 

Dadurch wird der Benutzer um die Erlaubnis gebeten, seinen aktuellen Standort abzurufen.

4
Annu

Objective-C-Prozedur Befolgen Sie die folgenden Anweisungen:

Für iOS-11 Schauen Sie sich für iOS 11 diese Antwort an: iOS 11-Standortzugriff

Fügen Sie der plist zwei Schlüssel hinzu und geben Sie die folgende Meldung ein:

 1. NSLocationAlwaysAndWhenInUseUsageDescription 
 2. NSLocationWhenInUseUsageDescription
 3. NSLocationAlwaysUsageDescription

enter image description here Für iOS-10 und niedriger:

NSLocationWhenInUseUsageDescription

enter image description here

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
if([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
    [locationManager requestWhenInUseAuthorization];
}else{
    [locationManager startUpdatingLocation];
} 

Delegieren von Methoden

#pragma mark - Lolcation Update 
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:
        case kCLAuthorizationStatusRestricted:
        case kCLAuthorizationStatusDenied:
        {
            // do some error handling
        }
            break;
        default:{
            [locationManager startUpdatingLocation];
        }
            break;
    }
}
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];
    userLatitude =  [NSString stringWithFormat:@"%f", location.coordinate.latitude] ;
    userLongitude =  [NSString stringWithFormat:@"%f",location.coordinate.longitude];
    [locationManager stopUpdatingLocation];
}

Schnelle Prozedur

Befolgen Sie die folgenden Anweisungen:

Für iOS-11 Schauen Sie sich für iOS 11 diese Antwort an: iOS 11-Standortzugriff

Fügen Sie der plist zwei Schlüssel hinzu und geben Sie die folgende Meldung ein:

 1. NSLocationAlwaysAndWhenInUseUsageDescription 
 2. NSLocationWhenInUseUsageDescription
 3. NSLocationAlwaysUsageDescription

enter image description here Für iOS-10 und niedriger:

enter image description here

import CoreLocation
class ViewController: UIViewController ,CLLocationManagerDelegate {
var locationManager = CLLocationManager()

//MARK- Update Location 
func updateMyLocation(){
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
    if locationManager.respondsToSelector(#selector(CLLocationManager.requestWhenInUseAuthorization)){
       locationManager.requestWhenInUseAuthorization()
    }
    else{
        locationManager.startUpdatingLocation()
    }
}

Delegieren von Methoden

//MARK: Location Update
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    NSLog("Error to update location :%@",error)
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .NotDetermined: break
    case .Restricted: break
    case .Denied:
            NSLog("do some error handling")
        break
    default:
        locationManager.startUpdatingLocation()
    }
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     let location = locations.last! as CLLocation
    var latitude = location.coordinate.latitude
    var longitude = location.coordinate.longitude

}
4
Alok

Für diejenigen, die Xamarin verwenden, musste ich den Schlüssel NSLocationWhenInUseUsageDescription manuell zur info.plist hinzufügen, da er in den Dropdown-Listen von Xamarin 5.5.3 Build 6 oder XCode nicht verfügbar war 6.1 - nur NSLocationUsageDescription befand sich in der Liste, und dies führte dazu, dass CLLocationManager weiterhin unbemerkt fehlschlug.

3
Derreck Dean

In iOS9 (mit Xcode 7 und Swift 2) wird ein ähnlicher Fehler angezeigt: Der Versuch, MapKit-Standortaktualisierungen zu starten, ohne zur Standortautorisierung aufzufordern. Muss - [CLLocationManager requestWhenInUseAuthorization] oder - [CLLocationManager aufrufen requestAlwaysAuthorization] first. Ich habe ein Tutorial verfolgt, aber der Tutor verwendete iOS8 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 (wenn jemand Hilfe benötigt):

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("Errors: " + error.localizedDescription)
    }
}

Schließlich habe ich das in info.plist eingefügt: Information Property List: NSLocationWhenInUseUsageDescription Value: App benötigt Location Server für Mitarbeiter

2

Behalten Sie Cocoa Keys Informationen immer zur Hand, um diese Updates zu erhalten. Hier ist der Link:

https://developer.Apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//Apple_ref/doc/uid/TP40009251-SW26

Genießen.

2
Marco

Um auf den Benutzerstandort in iOS zuzugreifen. Sie müssen zwei Schlüssel hinzufügen

NSLocationWhenInUseUsageDescription

NSLocationAlwaysUsageDescription

in die Datei Info.plist.

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Because I want to know where you are!</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Want to know where you are!</string>

Siehe hierzu folgendes Bild.

Info.plist image

2
Vinoth Vino

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

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

Das erforderliche Tag wird allen Info.plist-Dateien im aktuellen Verzeichnis (und in den Unterordnern) hinzugefügt.

Ein anderer ist:

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

Es wird Ihre Beschreibung zu allen Dateien hinzufügen.

2
user289841
        // ** Don't forget to add NSLocationWhenInUseUsageDescription in MyApp-Info.plist and give it a string

        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        // Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
        if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
            [self.locationManager requestWhenInUseAuthorization];
        }
        [self.locationManager startUpdatingLocation];


    // Location Manager Delegate Methods    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        NSLog(@"%@", [locations lastObject]);

}
2
  1. Fügen Sie den Schlüssel NSLocationWhenInUseUsageDescription oder NSLocationAlwaysUsageDescription (Hintergrund-GPS-Verwendung) mit einer Zeichenfolge hinzu, die Sie auffordert, bei jedem info.plist von jedem Ziel GPS zu verwenden.

  2. Bitte um Erlaubnis, indem du Folgendes ausführst:

    [self initLocationManager: locationManager];

Wo initLocationManager ist:

// asks for GPS authorization on iOS 8
-(void) initLocationManager:(CLLocationManager *) locationManager{

    locationManager = [[CLLocationManager alloc]init];

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

Denken Sie daran, dass die App den Benutzer nicht fragt, wenn sich die Schlüssel nicht auf jedem info.plist für jedes Ziel befinden. Die if bietet Kompatibilität mit iOS 7 und die respondsToSelector: -Methode garantiert zukünftige Kompatibilität, anstatt nur das Problem für iOS 7 und 8 zu lösen.

1
juan Isaza

Das Problem für mich war, dass die Klasse, die CLLocationManagerDelegate war, privat war, was verhinderte, dass alle Delegatmethoden aufgerufen wurden. Ich schätze, es ist keine alltägliche Situation, aber ich dachte, ich würde es erwähnen, falls es jemandem hilft.

0
Lorenzo

Ich füge diese Schlüssel in InfoPlist.strings in iOS 8.4, iPad mini 2 hinzu. Es funktioniert auch. Ich habe in meinem Info.plist keinen Schlüssel wie NSLocationWhenInUseUsageDescription festgelegt.


InfoPlist.strings :

"NSLocationWhenInUseUsageDescription" = "I need GPS information....";

Basis auf diesem Thread , es hieß as in iOS 7, kann in der InfoPlist.strings lokalisiert werden. In meinem Test können diese Schlüssel direkt in der Datei InfoPlist.strings konfiguriert werden.

Als Erstes müssen Sie Ihrer Datei Info.plist einen oder beide der folgenden Schlüssel hinzufügen:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

Beide Schlüssel enthalten eine Zeichenfolge, die beschreibt, warum Sie Ortungsdienste benötigen. Sie können eine Zeichenfolge wie "Ort ist erforderlich, um herauszufinden, wo Sie sich befinden" eingeben, die wie in iOS 7 in der InfoPlist.strings lokalisiert werden kann Datei.


UPDATE:

Ich denke @IOS 's Methode ist besser. Füge Schlüssel zu Info.plist mit leerem Wert hinzu und füge lokalisierte Zeichenfolgen zu InfoPlist.strings hinzu.

0
AechoLiu