Teste CoreLocation no iPhone Simulator
-
03-07-2019 - |
Pergunta
UPDATE: a partir de iOS 5 e Xcode 4.1 é agora é possível local de teste no simulador e até mesmo definir rotas. Consulte http://developer.apple.com para mais detalhes.
Legado Pergunta ??h2>
Existe uma maneira de CoreLocation teste no iPhone Simulator?
Tudo o que necessita é de ser capaz de definir o local de mim e tem CoreLocation devolvê-lo.
Solução 2
Obrigado pela grande gabarito, ele levou-me a encontrar uma solução robusta.
Todo o código pode ser encontrada aqui:
http://code.google.com/p/dlocation/
É muito confuso, mas como eu usá-lo ele vai ser tornar-se muito melhor.
A solução foi CLLocationManager
subclasse e definir um novo @protocol
delegado, chamado DLocationManagerDelegate
.
Ele é projetado para ser um simples substituto para CLLocationManagerDelegate
que compila para baixo a um muito camada fina quando implementado em um dispositivo real.
Ao executar no dispositivo retornará dados como normal usando CoreLocation
, mas no simulador ele irá ler a latitude ea longitude de um arquivo de texto (definida no arquivo DLocationManager.h).
Espero que isso ajude, a implementação está no lado simples e você tem que startUpdatingLocation
e stopUpdatingLocation
para atualizar a exibição.
Comentários e feedback será recebido com gratidão.
Outras dicas
Aqui é a minha simples hack que as forças do CLLocationMager para retornar os geocoords de Powell Tech Bookstore única no simulador:
#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
Use uma função de filtragem de troca em uma instância de teste quando executado no simulador. Onde quer que você recebido anteriormente a localização (chamada delegado, etc), passá-lo através deste:
+ (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
}
problemas de gerenciamento de memória de lado ...
Eu acho que há outro (melhor IMHO) abordar aqui do que subclassificação CLLocationManager como em
http://code.google.com/p/dlocation/
Em ObjectiveC parece ser possível substituir um método existente de uma classe sem substituindo-lo. Isso é muitas vezes chamado de "swizzling método":. Você define a sua própria categoria para uma classe existente de implementar um método existente nele
Do ponto de vista do cliente, tudo é transparente: ele tem a sensação de que ele está lidando com a CLLocationManager
real, mas na verdade, você "tomou o controle dela" . Para que ele não precisa lidar com qualquer subclasse especial ou qualquer protocolo de delegado especial:. Ele continua usando a mesma classe / protocolo como o de CoreLocation
Aqui está um exemplo para pegou o controle sobre o delegado um cliente iria injectar:
@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
Em seguida, nesta implementação, você está livre para lidar com um conjunto pré definido de coordenadas (provenientes de um arquivo de qualquer outro) que será "empurrado" para o delegado usando o protocolo CLLocationManagerDelegate
padrão.
Gatilho os retornos de chamada Core Location de uma classe de teste, se você precisa definir um local diferente do simulador lhe dá.
locationManager: didUpdateToLocation e locationManager:. DidFailedWithError callbacks sobrecarregados nunca são chamados no simulador iphone, isso é meio estranho, tudo que eu vejo é 0,0000 para lat, e 0.0000 para lon. como a posição. Na situação que você desenvolver algo, que é meio difícil de implementar todas as possíveis situações que podem ocorrer durante o manuseio localização, usando apenas simulador de ambiente.
Se você está interessado em atualizar o ponto userLocation azul em um MKMapView com as atualizações de localização simuladas, confira o meu FTLocationSimulator em http://github.com/futuretap/FTLocationSimulator
Ele lê um arquivo KML gerado pelo Google Earth para fornecer atualizações de localização contínuos.
Testing CoreLocation no iPhone Simulator
1) Para testar a localização no simulador, o melhor caminho é a utilização de arquivos GPX, basta ir ao Arquivos -> Novo -> Recurso -.> Arquivo GPX
2) Depois de adicionar a atualização de arquivos GPX as coordenadas de localização, como desejado.
3) uma vez que o arquivo GPX é adicionado ao projeto, selecione a Esquema -> Editar Esquema -> Executar -> Permitir Localização Simulação .tick a simulação localização e selecione o nome do arquivo GPX você acabou de criar.
Desta forma simulador irá sempre escolher suas coordenadas desejadas, que adicionamos em nosso arquivo GPX.