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?

28voto

Adarsh G J Punkte 2624
- (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 you need to do two extra things to get location working: Add a key to your Info.plist and request authorization from the location manager asking it to start. There are two Info.plist keys for the new location authorization. One or both of these keys is required. If neither of the keys are there, you can call startUpdatingLocation but the location manager won’t actually start. It won’t send a failure message to the delegate either (since it never started, it can’t fail). It will also fail if you add one or both of the keys but forget to explicitly request authorization. So the first thing you need to do is to add one or both of the following keys to your Info.plist file:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

Both of these keys take a string

which is a description of why you need location services. You can enter a string like “Location is required to find out where you are” which, as in iOS 7, can be localized in the InfoPlist.strings file.

Bildbeschreibung hier eingeben

19voto

Yinfeng Punkte 5091

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)])) {
        // wählen Sie eine Anfrage entsprechend Ihrem Geschäft aus.
        if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
            [self.locationManager requestAlwaysAuthorization];
        } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
            [self.locationManager  requestWhenInUseAuthorization];
        } else {
            NSLog(@"Info.plist enthält keine NSLocationAlwaysUsageDescription oder NSLocationWhenInUseUsageDescription");
        }
    }
#endif
    [self.locationManager startUpdatingLocation];

17voto

Nits007ak Punkte 743

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

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

    // Wenn der Status verweigert ist oder nur für die Verwendung im Vordergrund gewährt wurde, zeigen Sie einen Hinweis an
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status ==        kCLAuthorizationStatusDenied) {
        NSString *title;
        title = (status == kCLAuthorizationStatusDenied) ? @"Standortdienste sind deaktiviert" :   @"Hintergrundstandort ist nicht aktiviert";
        NSString *message = @"Um den Hintergrundstandort zu verwenden, müssen Sie in den Einstellungen für Ortungsdienste 'Immer' aktivieren";

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                            message:message
                                                           delegate:self
                                                  cancelButtonTitle:@"Abbrechen"
                                                  otherButtonTitles:@"Einstellungen", nil];
        [alertView show];
    }
    // Der Benutzer hat keine Ortungsdienste aktiviert. Fordern Sie die Hintergrundberechtigung an.
    else if (status == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestAlwaysAuthorization];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        // Leiten Sie den Benutzer zu den Einstellungen für diese App weiter
        NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication] openURL:settingsURL];
    }
}

13voto

In iOS 8 müssen Sie zwei zusätzliche Dinge tun, um die Standortfunktion zu aktivieren: Fügen Sie einen Schlüssel zu Ihrer Info.plist hinzu und fordern Sie vom Standort-Manager die Autorisierung an, um zu starten

Info.plist:

NSLocationUsageDescription
Ich benötige den Standort
NSLocationAlwaysUsageDescription
Ich benötige den Standort
NSLocationWhenInUseUsageDescription
Ich benötige den Standort

Fügen Sie dies Ihrem Code hinzu

if (IS_OS_8_OR_LATER)
{
    [locationmanager requestWhenInUseAuthorization];

    [locationmanager requestAlwaysAuthorization];
}

11voto

st.derrick Punkte 4629

Ein häufiger Fehler für Swift-Entwickler:

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

Wenn Sie immer noch kein Fenster sehen, das um Autorisierung bittet, überprüfen Sie, ob Sie die Zeile var locationManager = CLLocationManager() in der viewDidLoad Methode Ihres View Controllers platzieren. Wenn ja, wird selbst wenn Sie locationManager.requestWhenInUseAuthorization() aufrufen, nichts angezeigt. Das liegt daran, dass nachdem viewDidLoad ausgeführt wurde, die locationManager Variable dealloziert wird (entfernt).

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

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