2017-01-12 20 views
-2

ios appで場所を1度だけ取得する方法。iosで一度だけ場所を取得する方法

+1

あなたの問題は何ですか? –

+1

現在直面している問題をお知らせください。 – Manishankar

+0

OPは自分の解決策を共有したいと思うかもしれません。この場合は、QAとして投稿する必要があります。最初の問題点を記載した質問を投稿し、質問内の問題点と解決策ではなく、提案された解決策を投稿します。 – jcaron

答えて

3

ロケーションを取得したら、locationManagerの更新をやめ、locationManagerもリリースします。これは、locationManagerが不要になったためです。

[self.locationManager stopUpdatingLocation]; 
self.locationManager.delegate = nil; 
self.locationManager = nil; 
0

ios9以上では、方法は[locationManagerInstance requestLocation]です。しかし、この場所は最新かつ最善であるため、デリゲートメソッドを呼び出すためには、これは約10秒かかるでしょう。

別の方法(以前のios9バージョン)では、以前の方法[locationManagerInstance startUpdatingLocation]を使用して直接の場所を取得し、タイムスタンプを検証して最高の精度を得ることもできます。

ここに私が場所を取得するために使用しているコードがあります。 locationManagerインスタンスのグローバル参照を作成します。

@interface ViewController() 
{ 
    CLLocationManager *locationManager; 
} 

your.mファイル内のこれらのユーティリティメソッドを実装

-(BOOL)canUseLocationManager{ 
    if(([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) || ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways)){ 
     return YES; 
    } 
    return NO; 
} 

-(void) getCurrentLocation { 
    locationManager.delegate = self; 
    // ios 9 and above versions only 
    //[locationManager requestLocation]; // This may take more time when compare to alternate method 
    // ios 2 and later versions can use this method 
    [locationManager startUpdatingLocation]; 
} 

-(void) stopGettingCurrentLocation { 
    [locationManager stopUpdatingLocation]; 
} 

実装位置サービス委譲

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{ 
    if([CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined){ 
     [self doneCheckingAccessStatusForLocation]; 
    } 
} 

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ 
    [manager stopUpdatingLocation]; 
    locationManager.delegate = nil; 
    /* Clean the locationManager instance if you don't need*/ 
    //locationManager = nil; 
} 

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ 

    [manager stopUpdatingLocation]; 
    locationManager.delegate = nil; 

    CLLocation* location = [locations lastObject]; 
    NSDate* eventDate = location.timestamp; 

    /* Implement your business logics here */ 
    /* Clean the locationManager instance if you don't need*/ 
    //locationManager = nil; 
} 
ロケーション・マネージャ・インスタンスを作成する

最終の方法および場所に

-(void)checkForLocationService{ 
    if(!locationManager){ 
     locationManager = [[CLLocationManager alloc] init]; 
     locationManager.distanceFilter = kCLDistanceFilterNone; 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    } 
    locationManager.delegate = self; 
    if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined){ 
     [locationManager requestWhenInUseAuthorization]; 
    }else{ 
     [self doneCheckingAccessStatusForLocation]; 
    } 

} 

-(void)doneCheckingAccessStatusForLocation{ 
    if([self canUseLocationManager]){ 
     [self getCurrentLocation]; 
    } 
} 
をフェッチ開始

checkForLocationServiceメソッドを呼び出し、成功と失敗の委譲メソッドについてのロジックを実装します。

[self checkForLocationService]; 
関連する問題