Frage

Dies ist der Code, dass ich in meiner AppDelegate Klasse

haben
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = 1000;  // 1 Km
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];
}

Und das ist die Delegatmethode ich in meiner AppDelegate Klasse habe

    //This is the delegate method for CoreLocation
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{

        //printf("AppDelegate latitude %+.6f, longitude %+.6f\n", newLocation.coordinate.latitude, newLocation.coordinate.longitude);

}

Die Arbeits in 3.0, 3.1, 3.1.3, aber es funktioniert nicht in 4.0-Simulator und Gerät beide.

Was ist der Grund?

War es hilfreich?

Lösung

Ich hatte einen ähnlichen Fehler, und ist nun behoben. Das Problem wird erklärt Locationmanager Variable lokal. Erklären Sie es stattdessen als eine Klassenvariable und stellen Sie sicher, wird es beibehalten entweder direkt oder über Eigentum behalten (oder stark, wenn Sie ARC verwenden). Das löst das Problem! Die Frage war de Locationmanager Variable veröffentlicht wurde und nie die Delegierten aktualisiert. Hier ist der Code:

H-Datei:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>


@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> {
@private
    MKMapView *_mapView;
    CLLocationManager *_locationManager;
}

@property(nonatomic, strong) CLLocationManager *locationManager;

@end

.m-Datei:

self.locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[_locationManager startUpdatingLocation];

Ich hoffe, es hilft.

Andere Tipps

Does -locationManager:didFailWithError: in Ihrem Delegaten jemals aufgerufen? Ich denke nur, vielleicht haben Sie irgendwann den Zugriff auf Standortdaten verweigert und jetzt werden nicht aufgefordert, aber der Zugang verweigert wird.

Ich war verrückt versuchen, warum nur eine von mehreren Klassen, um herauszufinden, die eine CLLocationManager verwenden könnte nie einen Anruf zu jeder der CLLocationManagerDelegate Methoden erhalten.

Es stellt sich heraus: die Klasse von einem nicht-Hauptthread initialisiert wurde, so dass ihr CLLocationManager auf einem Nicht-Haupt-Thread erstellt wurde ... es könnte auch gewesen ein vorübergehendes Gewinde. Wie auch immer, den Anruf Einwickeln meiner Klasse mit der unten zu initialisieren war alles, was es für meine CLLocationManager Delegatmethoden nahm aufgerufen werden, zu erhalten.

dispatch_sync(dispatch_get_main_queue(), 
                    ^{
                         // create your class that will create a CLLocationManager here.
                     });

Unterm Strich also: Seien Sie nicht ein CLLocationManager auf etwas schaffen, sondern den Haupt-Thread, oder du wirst nie Ihre Delegatmethoden aufgerufen! Ich kannte dieses ... nur eine lange Zeit ... seufz. Verschwendete täglich diese ein, um herauszufinden, wieder! Da alle Ich CLLocationManager SO nie so erzogen lesen, ich bin Entsendung es hier. Hoffe, es hilft jemand!

Sind Sie sicher, dass Sie das Aufheben von Zuweisungen nicht den Standort-Manager irgendwo? Der Code, den Sie haben, zeigt es in der didFinishLaunching ... Methode zugeordnet ist, aber dann etwa vergessen zu werden (obwohl es nach wie vor und so sollte noch Arbeit beibehalten wird).

Haben Sie auch, dass die erste Pop-up sehen Sie gefragt werden, ob es OK ist, den Standort des Nutzers zu bekommen?

Setzen Sie die Codes in einem Viewcontroller "die Navigation gedrückt wird".

Mein Code ist.

In SomeViewController.h

#import <MapKit/MapKit.h>
@interface SomeViewController : UIViewController<CLLocationManagerDelegate>{
}
@property (nonatomic, strong) CLLocationManager *locationManager;
@end

In SomeViewController.m

#import "SomeViewController.h"

@implementation SomeViewController


-(void)findLocation{
    if ([CLLocationManager locationServicesEnabled]) {
        if (!self.locationManager) {
            self.locationManager = [[CLLocationManager alloc] init];
            self.locationManager.delegate = self;
            self.locationManager.distanceFilter = kCLDistanceFilterNone;
            self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
            [self.locationManager startUpdatingLocation];
        }
    }
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    NSLog(@"didUpdateLocations");

    CLLocation *lo = [locations objectAtIndex:0];
    NSLog(@"latitude = %f, longitude = %f", lo.coordinate.latitude, lo.coordinate.longitude);

    [manager stopUpdatingHeading];
}
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
    NSLog(@"didUpdateToLocation");}
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    NSLog(@"didFailWithError");
    [manager stopUpdatingLocation];
}

Das Problem, das ich denke, wegen ARC ist, wird Locationmanager freigegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top