5

現在、CLLocationManager から最後の場所を取得する必要があるアプリを開発しています (定期的な追跡なし)。それがどれほど古く、正確であるかは問題ではありません。追跡を開始する必要はありませんし、開始したくもありません。キャッシュから最後の場所を取得するだけで十分です。IMHO、CLLocationManagerはiOSの共有コンポーネントであり、一部のアプリが位置追跡を使用している場合、別のアプリはCLLocationManager.locationから最新の位置を使用できるはずです. CLLocationManager を割り当て/初期化し、その場所を取得するだけで十分です。しかし、そうではありません。私は iPhone4 でテストしました - Google マップを開始し、現在の場所を確認してからアプリに移動しましたが、[[CLLocationManager alloc] init] の後に場所のプロパティは nil です。

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

UPDATE2: 奇妙ですが、CLLocationManager の割り当て/初期化後に「アプリが位置情報サービスを使用したい」というアラートはありません。これが私のコードフラグメントです:

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

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

2 に答える 2

2

まずlocationManager、「静的な」場所が事前に保存されているかどうかを確認する必要があります。

もしそうなら、あなたは終わりです。

そうでない場合は、場所を取得したらstartUpdatingLocationdidUpdateToLocation:fromLocation:コールバックで行う必要があります。stopUpdatingLocation

私の経験では、これが 1 つの場所だけを取得するための最良の方法です。

著者の更新に合わせて更新:

stopUpdatingLocationの直後ではいけませんstartUpdatingLocationstartUpdatingLocationバックグラウンドでサービスを開始するため、場所を取得するまで待つ必要があるため、コールバック メソッドで呼び出す必要があります。

于 2012-05-24T10:04:33.890 に答える
1

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

-[CLLocationManager startUpdatingLocation]非同期プロセスを開始します。同じ実行ループ サイクルで停止すると、プロセスは開始されず、それが許可ダイアログが表示されない理由です。

次のようになります。

@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
于 2012-05-24T10:59:31.903 に答える