Question

MISE À JOUR: À partir d'iOS 5 et Xcode 4.1, il est désormais possible de tester l'emplacement dans le simulateur et même de définir des itinéraires. Voir http://developer.apple.com pour plus de détails.

Question héritée

Est-il possible de tester CoreLocation sur le simulateur iPhone?

Tout ce dont j'ai besoin, c'est de pouvoir définir l'emplacement moi-même et de le renvoyer à CoreLocation.

Était-ce utile?

La solution 2

Merci pour vos commentaires, cela m’a incité à trouver une solution robuste.

Tous les codes peuvent être trouvés ici:

http://code.google.com/p/dlocation/

Il est très désordonné, mais à mesure que je l'utilise, il sera devenu bien meilleur.

La solution consistait à sous-classer CLLocationManager et à définir un nouveau délégué @protocol , appelé DLocationManagerDelegate .

Il est conçu pour remplacer simplement CLLocationManagerDelegate et se compiler en une mince couche très lorsqu'il est déployé sur un périphérique réel.

Lors de son exécution sur le périphérique, les données sont renvoyées normalement à l'aide de CoreLocation , mais dans le simulateur, il lit la latitude et la longitude d'un fichier texte (défini dans le fichier DLocationManager.h).

J'espère que cela vous aidera, la mise en œuvre est simple et vous devez startUpdatingLocation et stopUpdatingLocation pour mettre à jour l'affichage.

Les commentaires et réactions seront les bienvenus.

Autres conseils

Voici mon piratage simple qui force le CLLocationMager à revenir les géocartes de la librairie technologique de Powell uniquement sur le simulateur:

#ifdef TARGET_IPHONE_SIMULATOR 

@interface CLLocationManager (Simulator)
@end

@implementation CLLocationManager (Simulator)

-(void)startUpdatingLocation {
    CLLocation *powellsTech = [[[CLLocation alloc] initWithLatitude:45.523450 longitude:-122.678897] autorelease];
    [self.delegate locationManager:self
               didUpdateToLocation:powellsTech
                      fromLocation:powellsTech];    
}

@end

#endif // TARGET_IPHONE_SIMULATOR

Utilisez une fonction de filtrage pour permuter une instance de test lors de l'exécution sur le simulateur. Où que vous ayez précédemment reçu l'emplacement (appel du délégué, etc.), transmettez-le-le:

+ (CLLocation *) wakkawakka: (CLLocation*) loc {
#ifdef TARGET_IPHONE_SIMULATOR
    /* replace with a test instance */
    return [[CLLocation alloc] initWithLatitude:10.0 longitude:20.0];
#else
    return loc;
#endif
}

Mis à part les problèmes de gestion de la mémoire ...

Je pense qu’il existe une autre approche (meilleure à mon humble avis) ici que CLLocationManager de la sous-classe comme dans

http://code.google.com/p/dlocation/

Dans ObjectiveC, il semble possible de remplacer une méthode existante d'une classe sans la remplacer. Ceci est souvent appelé "méthode swizzling". : vous définissez votre propre catégorie pour une classe existante et implémentez une méthode existante dans celle-ci.

Du point de vue du client, tout est transparent: il a l’impression de s’occuper du véritable CLLocationManager , mais vous en avez "pris le contrôle" . Ainsi, il n'a pas besoin de traiter de sous-classe spéciale ni de protocole de délégué spécial: il continue d'utiliser la même classe / le même protocole que celui de CoreLocation.

Voici un exemple pour prendre le contrôle du délégué qu'un client injecterait:

 
@implementation CLLocationManager (simulator) 

-(void) setDelegate:(id)delegate { //your own implementation of the setDelegate... } -(id)delegate { //your own implementation of the delegate.... } -(void)startUpdatingLocation { } -(void)stopUpdatingLocation { } //.... //same for the rest of any method available in the standard CLLocationManager @end

Ensuite, dans cette implémentation, vous êtes libre de traiter un ensemble de coordonnées prédéfini (provenant d'un fichier quelconque) qui sera "poussé". au délégué utilisant le protocole standard CLLocationManagerDelegate .

Déclenchez les rappels d'emplacement de noyau à partir d'une classe de test, si vous devez définir un emplacement autre que celui fourni par le simulateur.

les locationManager: didUpdateToLocation et locationManager: didFailedWithError ne sont jamais appelés dans le simulateur d'iphone, ce qui est un peu étrange, tout ce que je reçois est 0,0000 pour la lat., et 0,0000 pour lon. comme la position. Dans la situation où vous développez quelque chose, il est difficile de mettre en œuvre toutes les situations possibles pouvant survenir pendant la gestion de l'emplacement, en utilisant uniquement l'environnement du simulateur.

Si vous souhaitez mettre à jour le point bleu userLocation dans un MKMapView avec les mises à jour simulées, consultez mon FTLocationSimulator à http://github.com/futuretap/FTLocationSimulator

Il lit un fichier KML généré par Google Earth pour fournir des mises à jour continues de la localisation.

Test de CoreLocation sur un simulateur iPhone

1) Pour tester l'emplacement dans le simulateur, le meilleur moyen consiste à utiliser des fichiers GPX. Pour ce faire, accédez à Fichiers - > Nouveau - > Ressource - > Fichier GPX.

2) Après avoir ajouté le fichier GPX, mettez à jour les coordonnées de l'emplacement à votre guise.

3) une fois le fichier GPX ajouté au projet, sélectionnez le Schéma - > Modifier le schéma - > Run - > Autoriser la simulation d'emplacement . Sélectionnez la simulation d'emplacement, puis sélectionnez le nom du fichier GPX que vous venez de créer.

Ainsi, le simulateur sélectionnera toujours les coordonnées de votre choix que nous avons ajoutées à notre fichier GPX.

 Créer le fichier GPX

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top