2012-05-24 10 views
5

現在、CLLocationManagerから最終位置を取得する必要のあるアプリケーションを開発しています(定期的な追跡なし)。それは何歳、正確であるかは関係ありません。私は必要がなく、追跡を開始したい - 私はちょうどキャッシュからいくつかの最後の場所をつかむ必要があり、それはそれです。 IMHO、CLLocationManagerはiOSの共有コンポーネントです。一部のアプリで位置情報のトラッキングを使用している場合は、別のアプリがCLLocationManager.locationから最新の場所を使用できるようになります。 CLLocationManagerを割り当て/初期化し、その場所を取得するだけで十分です。しかし、そうではありません。私はiPhone4でテストしました - googleマップを開始し、私の現在の場所を見て、次に私のアプリに行ったが、[[CLLocationManager alloc] init]の後に場所のプロパティはnilです。CLLocationManagerから最後に既知の場所を取得するには、アプリが位置追跡を開始する必要がありますか?

更新:[locationManager startUpdatingLocation];および[locationManager stopUpdatingLocation]。結果は同じです。私は、唯一の解決策は、定期的な追跡を開始することだと思いますか?

UPDATE2:奇妙ですが、CLLocationManagerのalloc/initの後に「このアプリケーションは位置情報サービスを使用します」という警告はありません。ここに私のコードの断片です:あなたlocationManagerがある場合

CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 

[locationManager startUpdatingLocation]; 
[locationManager stopUpdatingLocation]; 
NSLog(@"%@", locationManager.location); //prints nil 
+0

私はあなたに見てお勧めしますが、[CoreLocationを使用して現在の場所を見つける方法](http://stackoverflow.com/questions/6516967/how-to-find-あなたの現在の位置とコア位置)、NSArrayにある場所を保存します。 –

答えて

2

まずあなたがチェックする必要があり、のは、「静的な」場所が事前に保存された、としましょう。

これが完了したら、完了です。

そうでない場合は、startUpdatingLocationをコールし、次にdidUpdateToLocation:fromLocation:コールバックでstopUpdatingLocationを取得する必要があります。

私の経験から、それは1つの場所だけを取得するための最良の方法だと言います。著者のアップデートを一致させるために

UPDATE:ちょうどstartUpdatingLocation

あなたがすべきではないstopUpdatingLocationstartUpdatingLocationはバックグラウンドでサービスを開始するので、場所を取得するまで待つ必要があります。そのため、コールバックメソッドでインボークしてください。

+0

静的な場所はどういう意味ですか?私がGoogleマップに行って、私の現在の位置を見ることができるなら、静的な場所と見なされるべきですか? Googleマップは間違いなく位置情報サービスを使用しているため、その後はCLLocationManagerに少なくとも1つの静的な場所が必要です。 – Centurion

+0

「didUpdateToLocation:fromLocation:」コールバックによってあなたのアプリケーションから届かなかった場所を意味します。また、Google Mapsは位置情報サービスを使用していますが、他のアプリで取得した場所をアプリが取得できるとは限りません。 – sonxurxo

+1

ところで、あなたが** locationManagerを使用して起動したときに警告が表示されることを99%確信しています。 – sonxurxo

1

CLLocationManagerを使用するには、CLLocationManagerDelegateをどこかに実装する必要があります。

-[CLLocationManager startUpdatingLocation]は非同期処理を開始します。同じrunloopサイクルでプロセスを停止すると、プロセスが開始されることはありません。これが許可ダイアログを表示しない理由です。

それはこのようなものになる:

@interface MyClass : NSObject <CLLocationManagerDelegate> { 
    CLLocationManager *manager; 
    CLLocation *lastLocation; 
} 

@end 

@implementation 

- (id)init { 
    self = [super init]; 
    if (self) { 
     manager = [[CLLocationManager alloc] init]; 
     manager.delegate = self; 
     [manager startUpdatingLocation]; 
    } 
    return self; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation; 
{ 
    lastLocation = newLocation; 
    [manager stopUpdatingLocation]; 
} 

// in your real implementation be sure to handle the error cases as well. 
@end 
関連する問題