Pergunta

Eu estou tentando obter a usuários latitude e longitude atuais com este método viewDidLoad. O mapa resultante está indicando corretamente a localização atual no entanto os NSLog consistentemente mostra:

2009-09-19 16:45:29.765 Mapper[671:207] user latitude = 0.000000
2009-09-19 16:45:29.772 Mapper[671:207] user longitude = 0.000000

Alguém sabe o que estou ausente aqui? Agradecemos antecipadamente a sua ajuda!

- (void)viewDidLoad {
    [super viewDidLoad];
    [mapView setMapType:MKMapTypeStandard];
    [mapView setZoomEnabled:YES];
    [mapView setScrollEnabled:YES];
    [mapView setShowsUserLocation:YES];

    CLLocation *userLoc = mapView.userLocation.location;
    CLLocationCoordinate2D userCoordinate = userLoc.coordinate;

    NSLog(@"user latitude = %f",userCoordinate.latitude);
    NSLog(@"user longitude = %f",userCoordinate.longitude);
}
Foi útil?

Solução

O mapa não vai tentar obter a localização usuários até que seja realmente exibido, tanto quanto eu sei. Um bom teste de isto é, quando você começa a caixa de diálogo pedindo-lhe se ele está OK para a aplicação para obter a localização dos usuários? Na minha experiência que sempre surgem somente após o mapa mostra na tela.

A melhor maneira de abordar este problema se você deve ter uma localização no arranque, é implementar o código do manipulador de Core Location clássico e obter a localização do inicialmente. Você pode parar de receber atualizações de lá uma vez que o mapa é para cima e obter mais alterações de lá (embora se você precisar de atualizações constantes você é melhor fora apenas manter com as atualizações padrão Core Location. Se você pensar sobre isso, quando você tem "usuário mostra localização" habilitada no mapa maior uso de core Location pelo seu aplicativo é essencialmente livre desde o GPS será despediu-se o tempo todo de qualquer maneira.

Outras dicas

Se você tentar obter coordenadas do usuário em viewDidLoad () método, ele vai sempre dar 0,0 resultado, porque ainda não é inicializado.

Você deve dar uma olhada em "Am I Onde" site da Apple forma de código de amostra. Ele explica o que você precisa. Você precisa usar CLLocationManager classe . Você também vai precisar o método

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

Este método vai ser chamado automaticamente toda vez que a localização do usuário é atualizado. Se você estiver usando simulador, então este método será chamado apenas uma vez e ele irá retornar algumas coordenadas padrão.

Hope isso ajuda.

A partir do documento em CLLocation , se a precisão horizontal ou precisão vertical é negativo, isso significa que ele não pode encontrar um valor. Eu suspeito que isso é o que está acontecendo aqui. Tenha em mente que se você só olhar uma vez, pode dar-lhe uma última localização aproximada conhecido antes mesmo de melhorar o resultado precisão.

Precisão Horizontal Da latitude coordenar e longitude identificar o centro do círculo e este valor indica o raio do círculo. Um negativo valor indica que a de coordenar latitude e longitude são inválidos.

Você deve obter a coordenada de CoreLocation vez de MapKit. MapView irá mostrar a localização do usuário depois que ele realmente tem localização atual. Antes da localização é determinada, a latitude e longitude são definidas como 0. 3

Você deve criar um instace CLLocationManager, conjunto delegado. Você será notificado quando a localização é determinada.

Como Kendall disse, o MKMapView não tem uma localização do usuário até que ele termine o carregamento, ea método viewDidLoad é geralmente muito cedo para solicitá-lo. Uma maneira mais simples de usar CoreLocation é implementar o método MKMapViewDelegate -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation. Ele lhe dará a localização do usuário assim que ele está localizado, sem ter que lidar com um CLLocationManager.

Esta resposta explica como definir uma visualização do mapa com uma localização do usuário:

HowTo Inicializar MKMapView com uma determinada localização do usuário?

Tente isso em

CLLocation *userLoc = mapView.userLocation.location;
CLLocationCoordinate2D userCoordinate = userLoc.coordinate;

NSLog(@"user latitude = %f",userCoordinate.latitude);
NSLog(@"user longitude = %f",userCoordinate.longitude);

viewDidAppear: ou ligue para executar Seletor após atraso

Adicione isto a sua seção viewDidLoad

mapView.showsUserLocation = YES;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top