2009-10-16 25 views
1

J'ai simple MapView qui a la méthode viewDidLoad suivante et didupdate à l'emplacement:iphone updateToLocation fonctionne différemment sur le réseau 3G par rapport au réseau sans fil?

- (void)viewDidLoad { 
    NSLog(@"in view did load"); 
    [super viewDidLoad]; 
    self.mapView.showsUserLocation = YES; 
    self.put_url = nil; 


    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; 
    [locationManager setDelegate:self]; 

    noUpdates = 0; 
    [locationManager startUpdatingLocation]; 

    self.availableParking = [[NSMutableArray alloc] init]; 
    //self.availableParking = nil; 

} 


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 

    NSLog(@"in didupdatetolocatoin"); 
    if([newLocation horizontalAccuracy] < 100 && [newLocation horizontalAccuracy] > 0) { 


    // Add annotation to map 
    DDAnnotation *annotation = [[DDAnnotation alloc] initWithCoordinate:newLocation.coordinate title:@"Park Here?"]; 

    MKCoordinateRegion region; 
    MKCoordinateSpan span; 
    span.latitudeDelta = 0.05; 
    span.longitudeDelta = 0.05; 


    region.span = span; 
    region.center = newLocation.coordinate; 



    self.mapView.region = region; 



    NSLog(@"in didupdatetolocation"); 
    noUpdates++; 
     NSLog(@"IN UPDATELOCATION NOUPDATES = %d",noUpdates); 
    if (noUpdates == 1) { 
     [self.mapView addAnnotation:annotation]; 
     NSLog(@"ADDED ANNOTATION IN didUpdateToLocation!!"); 


     [locationManager stopUpdatingLocation]; 
     [self.settingsViewController setState:self.mapView.userLocation.subtitle andCity:@"fuckface"]; 



     NSLog(@"STOPPED UPDATING LOCATION"); 


     UpdateLocation *updatedLocation = [[[UpdateLocation alloc] initWithUserid:@"fuckface" andCoordinate:newLocation.coordinate withMapViewController:self] 
              autorelease]; 
     NSLog(@"Lat = %f, Long = %f",newLocation.coordinate.latitude,newLocation.coordinate.longitude); 
     //[NSThread detachNewThreadSelector:@selector(getLocations) toTarget:self withObject:nil]; 
     [[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(sendUpdate) 
     name:@"NoteFromOne" 
     object:updatedLocation]; 


     } 
    // We only update location once, and let users to do the rest of the changes by dragging annotation to place they want 

     } else { 
      NSLog(@"Accuracy not good enough %lf", [newLocation horizontalAccuracy]); 

     } 



} 

Lorsque Im connecté à un réseau sans fil, il fonctionne parfaitement dans le zoom et laissant tomber une broche d'annotation dans mon emplacement actuel. Sur le réseau 3G, il ne fait jamais de zoom ou de chute de la broche. Une quelconque idée du pourquoi? Merci d'avance.

est ici quelques captures d'écran:

Avec la 3G: alt text http://www.freeimagehosting.net/uploads/fe7fcbb2ea.jpg

Avec wifi: alt text http://www.freeimagehosting.net/uploads/6b653e60a7.jpg

Répondre

0

L'unité GPS n'a rien à voir avec la connexion réseau (sauf si le signal GPS est pas disponible, auquel cas le GPS peut essayer d'utiliser le hotspot wifi ou la cellule à laquelle votre appareil est connecté afin de déduire votre position). Il fonctionne indépendamment si le signal GPS est disponible, et le réseau est seulement utilisé pour montrer réellement la carte. À partir du code que vous avez affiché, vous ne montrez la carte que lorsque vous atteignez une précision horizontale inférieure à 100 mètres, sinon vous laissez l'unité GPS mettre à jour l'emplacement. Cependant, si vous essayez votre code exactement au même endroit, l'unité GPS de votre appareil devrait toujours retourner les mêmes mises à jour. Par conséquent, je ne comprends vraiment pas le comportement que vous décrivez: cela ne serait possible que si l'unité GPS renvoyait des mises à jour différentes pour le même endroit lorsqu'une autre connexion réseau est disponible car le signal GPS n'est pas disponible. Voyez-vous la même latitude/longitude dans les deux cas ou non? Voyez-vous la même précision? Veillez à mesurer cela exactement au même endroit dans les deux cas.

Si vous obtenez les mêmes mises à jour, il est possible que votre connexion cellulaire 3G ne soit pas assez puissante ou ne soit disponible qu'en apparence, de sorte que vous n'avez pas obtenu la carte. Essayez de tester la vitesse de votre réseau 3G depuis le même endroit.

Une considération connexe. Vous devez laisser l'unité GPS fonctionner jusqu'à ce que la durée spécifiée soit écoulée (disons 20 secondes, utilisez NSTimer pour cela) ou jusqu'à ce que vous atteigniez un niveau de précision spécifié, selon la première éventualité. Sinon, vous risquez de consommer trop d'énergie.

+0

Le GPS a quelque chose à voir avec la connexion réseau sur l'iPhone. iOS utilise le réseau pour obtenir des éphémérides satellites et calculer un emplacement initial qui accélère considérablement le temps (en minutes) nécessaire pour acquérir le verrouillage sur les satellites GPS. C'est pourquoi on l'appelle [Assisted GPS] (http://artoftheiphone.com/2008/06/10/iphone-3g-what-is-assisted-gps/) (AGPS). – progrmr