2012-04-25 17 views
4

コアロケーションフレームワークを使用してデバイスを特定し、locationManager:didUpdateToLocation:fromLocation:メソッドがロケーションとともに呼び出された後、ユーザーの追跡を停止します。コアロケーションが受け入れプロンプト後に更新されない

ただし、初めて(初めてのインストールから)アプリを起動します。ロケーションマネージャのstartUpdatingLocationというメッセージを表示すると、ユーザーは位置情報サービスを受け入れるか拒否するかの警告を受け取ります。

私は追跡は私が離れて行くとstartUpdatingLocationが再び通知が入って来始めることに呼び出されたときに、このビューコントローラに戻ってきた場合にのみ、それはだ、始まらない受け入れる

私はlocationManagerを実装しています:。didChangeAuthorizationStatusを:思考をこれは、ユーザーが位置情報サービスを受け入れる(または拒否する)ときにメッセージを受け取るが、そうではないことを意味する。

位置情報サービスのメッセージが消されるとすぐに、誰かが正しい方向に私の位置を更新することができますか?

ありがとうございました。ユーザーの場所が要求されたとき、私は私のロジックをカプセル化するシングルトンクラスを持っているコードサンプル

WITH

UPDATEは、アイデアはCLLocationのタイムスタンプのチェックが行われ、それはあまりにも古いなら、追跡を開始されていますこれは怠惰な負荷、私のCLLocationManager IVARをメッセージとして送られ、

-(void)startTracking{ 

    if(!self.locationManager) 
     _locationManager = [[CLLocationManager alloc] init]; 


    if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){ 
     [self invalidateUserLocation]; 
    }else{ 
     self.locationManager.delegate = self; 
     [self.locationManager startUpdatingLocation]; 
    } 

} 

新しい場所が受け取っ:

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
    _userLocation = [newLocation retain]; 

    NSDictionary * info = [NSDictionary dictionaryWithObject:self.userLocation 
                 forKey:@"userLocation"]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:kUserLocationFound 
                 object:self 
                 userInfo:info]; 
    [self stopTracking]; 

} 

停止の追跡:

-(void)stopTracking{ 
    if(!self.locationManager) 
     return; 

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

ユーザーの場所が必要なビューコントローラーを使用しているときに、私はシングルトンオブジェクトでuserLocationを呼び出します。最近の場合は、CLLocationを返します。それ以外の場合は、nilを返して、再び開始します。最初の更新を受け取ったときにトラッキングを停止します。しかし、これが初めて実行されたときに警告表示が表示され、何も追跡されません。

- (CLLocation*)userLocation 
{ 
    if(_userLocation.coordinate.latitude == 0 && _userLocation.coordinate.longitude == 0){ 
     [self startTracking]; 
     return nil; 
    }else{ 
     NSDate* timeNow = [NSDate date]; 
     NSTimeInterval interval = [timeNow timeIntervalSinceDate:_userLocation.timestamp]; 
     if(interval >10) 
      [self startTracking]; 

     return _userLocation; 
    } 
} 
+1

CLLocationManagerインスタンスでstartUpdatingLocationを呼び出していますか? – jmstone617

+0

そうです、私はCLLocationManagerインスタンスで呼びます。 – Daniel

+0

いくつかのコードを表示できますか? – jmstone617

答えて

16

あなたはCLLocationManagerDelegateから– locationManager:didChangeAuthorizationStatus:を呼び出してみましたか?

私は、ビューコントローラが読み込まれたときにstartTrackingと呼ぶことを推測します。これは大丈夫かどうかを尋ねるアラートによって回避されます。その時点で、開始位置のメッセージは再度呼び出されないので、didChangeAuthorizationStatusを呼び出すことで、startTrackingメソッドを呼び出すことができます。以下のような

何か:

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 

    if (status == kCLAuthorizationStatusDenied) { 
     //location denied, handle accordingly 
    } 
    else if (status == kCLAuthorizationStatusAuthorized) { 
     //hooray! begin startTracking 
    } 

} 

付属していない場合、私に知らせてください。

+0

私はちょうど(CLAuthorizationStatus)のステータスが0になっていて、追跡場所が発生していません –

関連する問題