4

Core Locationフレームワークを使用してデバイスを特定し、locationManager:didUpdateToLocation:fromLocation:メソッドが場所で呼び出されると、ユーザーの追跡を停止します。

ただし、初めてアプリを起動したとき(新規インストールから)。Location ManagerのstartUpdatingLocationにメッセージを送信すると、ユーザーは位置情報サービスを受け入れるか拒否するかを示すアラートを受け取ります。

追跡が開始されないことを受け入れると、通知が着信し始めるのは、startUpdatingLocationが再度呼び出されたときに、離れてこのViewControllerに戻ったときだけです。

私はlocationManager:didChangeAuthorizationStatusを実装しています:ユーザーが位置情報サービスを受け入れる(または拒否する)とメッセージが表示されると考えていますが、そうではありません。

位置情報サービスのメッセージが却下されたらすぐに、位置情報を更新するための正しい方向を誰かに教えてもらえますか?

ありがとう。

コードサンプルで更新

ロジックをカプセル化するシングルトンクラスがあります。ユーザーの場所が要求されたときに、CLLocationのタイムスタンプのチェックが実行され、古すぎる場合は追跡開始のメッセージが表示されます。これにより、CLLocationManageriVarが遅延ロードされます。

-(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;
}

ユーザーの場所を必要とするViewControllerがある場合、そのようにシングルトンオブジェクトで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;
    }
}
4

1 に答える 1

16

– locationManager:didChangeAuthorizationStatus:から電話してみましたCLLocationManagerDelegateか?

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

何かのようなもの:

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

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

}

そうでない場合は、私に知らせてください。

于 2012-04-25T21:52:12.593 に答える