O que você precisa fazer é configurar um CLLocationManager
que encontrará suas coordenadas atuais. Com as coordenadas atuais, você precisa usar MKReverseGeoCoder
para encontrar sua localização.
- (void)viewDidLoad
{
// this creates the CCLocationManager that will find your current location
CLLocationManager *locationManager = [[[CLLocationManager alloc] init] autorelease];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
[locationManager startUpdatingLocation];
}
// this delegate is called when the app successfully finds your current location
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// this creates a MKReverseGeocoder to find a placemark using the found coordinates
MKReverseGeocoder *geoCoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
geoCoder.delegate = self;
[geoCoder start];
}
// this delegate method is called if an error occurs in locating your current location
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"locationManager:%@ didFailWithError:%@", manager, error);
}
// this delegate is called when the reverseGeocoder finds a placemark
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark
{
MKPlacemark * myPlacemark = placemark;
// with the placemark you can now retrieve the city name
NSString *city = [myPlacemark.addressDictionary objectForKey:(NSString*) kABPersonAddressCityKey];
}
// this delegate is called when the reversegeocoder fails to find a placemark
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error
{
NSLog(@"reverseGeocoder:%@ didFailWithError:%@", geocoder, error);
}
A partir do iOS 5
MKReverseGeoCoder
está obsoleto!Então você quer usar
CLGeocoder
comCLLocationManager
, muito simples e funciona com bloco.Exemplo:
Editar: em vez de um
for in
loop, você também pode fazer:fonte
Isso está funcionando bem para mim:
fonte
kCLErrorDomain error 8
sabe por quê?Se alguém está tentando mudar para CLGeocoder a partir de MKReverseGeocoder, escrevi uma postagem no blog que pode ser útil http://jonathanfield.me/jons-blog/clgeocoder-example.html
Basicamente, um exemplo seria, depois de criar os objetos locationManager e CLGeocoder, basta adicionar esse código ao viewDidLoad () e criar alguns rótulos ou áreas de texto para mostrar os dados.
fonte
nil
, e as mensagens enviadas paranil
resultar emnil
, bem como o acesso à propriedade por meio da notação de ponto vianil
. Dito isto, deve-se sempre verificar seerror
não énil
.Se alguém precisar no Swift 3 , é assim que eu fiz:
fonte
Depois de configurar CLLocationManager, você obterá a atualização de localização como um par de latitude / longitude. Em seguida, você poderia usar CLGeocoder para converter a coordenada em um nome de local amigável.
Aqui está o código de amostra em Swift 4 .
fonte
Você deve obter a localização atual do usuário e, em seguida, usar o MKReverseGeocoder para reconhecer a cidade.
Há um ótimo exemplo no Guia de programação de aplicativos do iPhone , capítulo 8. Assim que tiver o geocodificador de inicialização de localização, defina o delegado e leia o país a partir do marcador. Leia a documentação para MKReverseGeocodeDelegate e crie métodos:
reverseGeocoder: didFailWithError:
fonte
Você pode usar este código para obter a cidade atual: -
extensão YourController: CLLocationManagerDelegate {func locationManager (gerente: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
fonte
fonte
Aqui está minha pequena aula de Swift, que me ajuda a obter informações geocodificadas reversas sobre a localização atual. Não se esqueça do
NSLocationWhenInUseUsageDescription
campo emInfo.plist
.fonte
Leia a documentação do MKReverseGeocoder - a documentação, os guias e os aplicativos de amostra são fornecidos pela Apple por um motivo.
fonte