GPSデータ逆地理情報符号化により現在位置情報を得る

4200 ワード

可用性の確認
これは基礎知識に属し、言うまでもなく、総じて言えば、あなたの設備のサポートは開いて、CoreLocationのframeworkを追加して、ヘッダファイルを引用して、依頼を追加して、それから、良い実践は使用前にプログラミングして関連の可用性を検査することです:
- (CLLocationManager *)locationManager

{

    if(!_locationManager){

        if([CLLocationManager locationServicesEnabled]){

            _locationManager = [[CLLocationManager alloc] init];

            _locationManager.delegate = self;

            _locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;

            CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

            if (status == kCLAuthorizationStatusNotDetermined) {

                NSLog(@" not determined");

                if([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){

                    [_locationManager requestAlwaysAuthorization];

                }

            }else if (status == kCLAuthorizationStatusDenied) {

                NSLog(@"denied");

            }else if (status == kCLAuthorizationStatusRestricted) {

                NSLog(@"restricted");

            }else if (status == kCLAuthorizationStatusAuthorizedAlways) {

                NSLog(@"always allowed");

            }else if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {

                NSLog(@"when in use allowed");

            }else{

            }

        }else _locationManager = nil;

    }

    return _locationManager;

}


注意kCLAuthorizationStatusNotDetermined状態、iOS 8以降、info.plistファイルを手動で編集し、ユーザーの許可を要求したときの文案を2つ追加してから正常に使用する必要があります.
<key>NSLocationWhenInUseUsageDescription</key>

<string>           </string>

<key>NSLocationAlwaysUsageDescription</key>

<string>           </string>


以上、ネット上の任意の1編の教程.を参照することができます.
地理的位置を要求し、逆符号化
ここで注意しなければならないのは、アップルのCLGeocoder APIでは頻繁に呼び出すことは許可されていません.1分に1回が適切です.だから、[self.locationManager startUpdatingLocation]は絶対にしないでください.それからlocationManager:didChangeAuthorizationStatus:方法でdecodeに行きます.都市を得るためだけに、精度の要求は高くありません.そして、もっと新しいものを続ける必要はありません.だから、updateは必要ありません.requestは1回だけです.次に、場所の取得に失敗したときに手動でリクエストします.
+ (void)locationManager:(nonnull CLLocationManager *)manager didFailWithError:(nonnull NSError *)error{

    NSLog(@"fail with error:
%@", error); [self.locationManager requestLocation]; }

関連説明この文章参照
言語の問題
英語システムに慣れているため、要求された情報が英語の原因であることに遭遇した.ここでアップルは固化しており、パラメータでデータを返す表示言語を指定することは一時的にサポートされていない.この文章の考え方を参考にして、要求前に現在の言語設定を保存し、すぐに中国語に変更し、要求が終わったら修正して帰ってくる.
+ (void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray *)locations{

    CLLocation *location = [locations lastObject];

    CLGeocoder *geocoder = [CLGeocoder new];

    //        

    NSArray *currentLanguageArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];

    [[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:@"zh_Hans", nil] forKey:@"AppleLanguages"];

    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * __nullable placemarks, NSError * __nullable error) {

        //     

        [[NSUserDefaults standardUserDefaults] setObject:currentLanguageArray forKey:@"AppleLanguages"];

        if(error){

            NSLog(@"reverse error:%@", [error localizedDescription]);

        }else{

            if([placemarks count] > 0){

                CLPlacemark *mark = [placemarks firstObject];

                NSLog(@"%@", mark);

                NSLog(@"   :%@", mark.locality);

            }

        }

    }];

}