70 votes

Obtenir l'emplacement de l'appareil (pays uniquement) dans iOS

J'ai besoin d'obtenir l'emplacement du pays d'un appareil iOS.

J'ai essayé d'utiliser CoreLocation avec MKReverseGeocoder. Cependant, cela semble revenir assez fréquemment erratique. Et je n'ai besoin que du pays, pas besoin de rues et autres.

Comment cela peut-il être fait de manière plus stable?

45voto

Denis Points 3646

NSLocale n'est qu'un paramètre concernant les paramètres régionaux actuellement utilisés, cela ne signifie pas le pays dans lequel vous vous trouvez.

Utilisez CLLocationManager pour obtenir l'emplacement actuel et CLGeocoder pour effectuer un géocodage inversé. Vous pouvez obtenir le nom du pays à partir de là.

15voto

Matt Points 166

La réponse de @ Denis est bonne -- voici un code mettant sa réponse en pratique. Il s'agit d'une classe personnalisée que vous avez définie pour se conformer au protocole CLLocationManagerDelegate C'est un peu simplifié (par exemple, si le gestionnaire d'emplacement renvoie plusieurs emplacements, cela va juste avec le premier) mais devrait donner aux gens un bon départ ...

 - (id) init //designated initializer
{
    if (self)
    {
        self.locationManager = [[CLLocationManager alloc] init];
        self.geocoder = [[CLGeocoder alloc] init];
        self.locationManager.delegate = self;
        [self.locationManager startMonitoringSignificantLocationChanges];
    }
    return self;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    if (locations == nil)
        return;

    self.currentLocation = [locations objectAtIndex:0];
    [self.geocoder reverseGeocodeLocation:self.currentLocation completionHandler:^(NSArray *placemarks, NSError *error)
    {
        if (placemarks == nil)
            return;

        self.currentLocPlacemark = [placemarks objectAtIndex:0];
        NSLog(@"Current country: %@", [self.currentLocPlacemark country]);
        NSLog(@"Current country code: %@", [self.currentLocPlacemark ISOcountryCode]);
    }];
}

13voto

lindanordstrom Points 341

Voici les réponses de @Denis et @Matt rassemblées pour une solution Swift 3:

 import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()
    let geoCoder = CLGeocoder()

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.requestAlwaysAuthorization()
        if CLLocationManager.locationServicesEnabled() {
            locationManager.delegate = self
            locationManager.startMonitoringSignificantLocationChanges()
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let currentLocation = locations.first else { return }

        geoCoder.reverseGeocodeLocation(currentLocation) { (placemarks, error) in
            guard let currentLocPlacemark = placemarks?.first else { return }
            print(currentLocPlacemark.country ?? "No country found")
            print(currentLocPlacemark.isoCountryCode ?? "No country code found")
        }
    }
}

N'oubliez pas de définir également le NSLocationAlwaysUsageDescription ou le NSLocationWhenInUseUsageDescription en Info.plist !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X