2010-06-17 14 views
12

Questo è il codice che ho nel mio AppDelegate ClassePerché il delegato CLLocationManager non viene chiamato in iPhone SDK 4.0?

- (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]; 
} 

e questo è il metodo delegato che ho nella mia classe AppDelegate

//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); 

} 

Il suo lavoro in 3.0, 3.1, 3.1.3, ma non funziona in 4.0 simulatore e dispositivo entrambi.

Qual è il motivo?

+0

Grazie a Christopherson per un approccio positivo ..... ma siamo diventati fantocci e dobbiamo cambiare il nostro codice ogni volta che viene rilasciata una nuova versione dell'SDK di iPhone. Sempre alcuni metodi sono deprecati o non funzionano ... – Biranchi

+0

Grazie @Scott Christopherson per favore votate per chiudere questa domanda .... poiché nessuno può risolvere questo problema ... – Biranchi

+0

Di fronte allo stesso problema qui, sei sicuro che ci vorranno circa 40 secondi per aggiornare la posizione? –

risposta

21

Ho avuto un errore simile ed è stato risolto ora. Il problema è la dichiarazione della variabile locationManager localmente. Dichiaralo come variabile di classe e assicurati che sia mantenuto direttamente o tramite proprietà retain (o strong se usi ARC). Questo risolve il problema! Il problema era che la variabile de locationManager è stata rilasciata e non ha mai aggiornato il delegato. Ecco il codice:

file h:

#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 

di file .m:

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

spero che aiuta.

0

Sei sicuro di non aver spostato il responsabile della posizione da qualche parte? Il codice che hai mostrato viene assegnato nel metodo didFinishLaunching ... ma poi viene dimenticato (anche se è ancora conservato e quindi dovrebbe ancora funzionare).

Hai persino visto il popup iniziale che ti chiede se è possibile ottenere la posizione dell'utente?

+0

sì provato tutte le possibili soluzioni ... devo reinstallare l'iphone SDK ??? ? – Biranchi

2

Il numero -locationManager:didFailWithError: nel proprio delegato viene mai chiamato? Sto solo pensando, forse hai negato l'accesso ai dati sulla posizione a un certo punto e ora non ti viene richiesto, ma l'accesso è negato.

0

Inserire i codici in un viewController "che viene premuto su navigationController".

Il mio codice è.

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]; 
} 

Il problema credo sia a causa di ARC, locationManager viene rilasciato.

Problemi correlati