2014-06-26 3 views
1

Salut Je développe sur un iPad Mini 1ère génération avec cellulaire et besoin d'utiliser son GPS interne pour acquérir lat/longues coordonnées. Je serai sur un bateau et j'appuierai sur un bouton qui enregistrera les coordonnées dans un fichier texte sur l'iPad (répertoire du document). Ensuite, je vais naviguer à 10 miles de distance et appuyez à nouveau sur le bouton qui ajoutera les nouvelles coordonnées au fichier texte. Je vais le faire 8 fois et devrait avoir 8 paires de coordonnées différentes. Cependant, l'application est très incohérente et garde les mêmes coordonnées ou n'en acquiert pas du tout. Pour rappel je n'utilise pas le wifi/cellulaire, seul le GPS interne (le GPS sur le bateau est capable d'acquérir du signal donc ce n'est pas un problème matériel). Mon code est ci-dessous. Merci d'avance!CoreLocation Mises à jour avec GPS

//in viewDidLoad 

    self.locman = [[CLLocationManager alloc] init]; 
    self.locman.delegate = self; 
    self.locman.desiredAccuracy = kCLLocationAccuracyBest; 
    self.locman.distanceFilter = kCLDistanceFilterNone; 
    self.locman.desiredAccuracy = kCLLocationAccuracyHundredMeters; 

// méthode délégué

#define REQ_ACC 10 
#define REQ_TIME 10 

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 
    CLLocation* loc = locations.lastObject; 
    CLLocationAccuracy acc = loc.horizontalAccuracy; 
    NSDate* time = loc.timestamp; 
    CLLocationCoordinate2D coord = loc.coordinate; 
    if (!self.startTime) { 
     self.startTime = [NSDate date]; 
     return; // ignore first attempt 
    } 
    NSLog(@"%f", acc); 
    NSTimeInterval elapsed = [time timeIntervalSinceDate:self.startTime]; 
    if (elapsed > REQ_TIME) { 
     NSLog(@"%@", @"This is taking too long"); 
     [self stopTrying]; 
     return; 
    } 
    if (acc < 0 || acc > REQ_ACC) { 
     return; // wait for the next one 
    } 
    // got it 
    NSLog(@"You are at: %f %f", coord.latitude, coord.longitude); 
    self.lat = [NSString stringWithFormat:@"%.8f",coord.latitude]; 
    self.longString = [NSString stringWithFormat:@"%.8f",coord.longitude]; 
    [self stopTrying]; 
} 


-(void) stopTrying { 
    [self.locman stopUpdatingLocation]; 
    self.startTime = nil; 
    self.trying = NO; 
} 

// Ceci est un IBAction (un bouton presse lorsque l'utilisateur souhaite enregistrer les coordonnées)

[self.locman startUpdatingLocation]; 
+1

Donc, gardez-vous les mises à jour de localisation en cours en arrière-plan? Commencez-vous des mises à jour quelques minutes avant de vouloir enregistrer l'état? – Wain

+0

Non, les mises à jour démarrent immédiatement après la pression d'un UIButton et s'arrêtent après avoir atteint la méthode stopTrying. – user2402616

+1

Donc, vous autorisez un maximum de 10 secondes pour verrouiller un emplacement - ne va pas être assez ... – Wain

Répondre

1

Essayez de mettre cette pausesLocationUpdatesAutomatically = NO avec votre CLLocationManager

Il semble que stopTrying est jamais appelé (je devine, à cause de la nouvellement init time et elapsed) de sorte que le GPS a fait une pause automatiquement.

De plus, si vous voulez une minuterie « de délai d'attente » pour cette méthode, vous devriez commencer une NSTimer en vous IBAction et appelez stopTrying et invalidate la minuterie à l'intérieur aussi.

Questions connexes