2009-09-04 25 views
0

野郎、iPhoneのCorelocationフレームワークの制限?

私は、ユーザーが一度彼の場所を使用することを許可されたときに何が起こって、複数回その場所をユーザーに依頼する機能を必要とするアプリケーションを開発し、彼はそれを求めていない別のセクションに移動しています彼は自分の位置を取得するために、すでにキャッシュされた場所から取得しています。

あなたの場所を取得するために彼の承認のためにユーザーに複数回質問することは可能ですか?

助けてください。

乾杯、 アミット

答えて

5

あなたが許可を複数回取得する必要はありません。更新情報を取得開始するに

、あなたが呼び出す:

[locationManager startUpdatingLocation]; 

をあなたは連続位置情報の更新を取得します[locationManager stopUpdatingLocation]呼び出すまで。

したがって、新しい場所を取得したときに何が起こるかを示すデリゲートメソッドを実装する必要があります。このデリゲートメソッドは、後で使用するために場所をクラス変数に保存するだけの簡単な操作を行うことができます。

あなたが実装する必要がデリゲート関数は次のとおりです。

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation {} 

私はここであなたを警告しなければなりません。 GPSを絶えず走らせるのはバッテリーの消費量です(できるだけ正確な読み取りを要求している場合は約2.5時間でデバイスを殺します)。したがって、ユーザーがアプリをオンにしてからstopUpdatingLocationを呼び出すと、修正する必要があります。

あなたのアプリでは、「Locate Me」ボタンをクリックすると、LocationManagerがオンになり、修正が得られ、LocationManagerが再びオフになります。適切なlocation.horizo​​ntalAccuracyを得るまで、場所のポーリングを続けることができます。

LocationManagerDelegateプロトコルを実装するNSObjectサブクラスを実装することをお勧めします。次に、このオブジェクトは複数のView Controllerで共有されます。ここには、中央のgpsControllerの簡単な実装があります。

だから、これはgpsController.h次のようになります。

#import <Foundation/Foundation.h> 
#import <CoreLocation/CoreLocation.h> 

@interface gpsController : NSObject <CLLocationManagerDelegate> { 
    CLLocationManager *locationManager; 
    CLLocation *lastReading; 
} 


- (id)init; 

@property (nonatomic, retain) CLLocationManager *locationManager; 
@property (nonatomic, retain) CLLocation *lastReading; 

@end 

そして次はgpsController.mです:

#import "gpsController.h" 

@implementation gpsController 

@synthesize locationManager, lastReading; 

- (id)init { 

    if(self = [super init]) { 

    [[self locationManager] startUpdatingLocation]; 

    self.lastReading = nil; 

    } 

    return self; 

} 


- (CLLocationManager *)locationManager { 

    if (locationManager) return locationManager; 

    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; 
    locationManager.delegate = self; 

    return locationManager; 

} 


- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation { 

    self.lastReading = newLocation; 

} 
0

iPhoneプログラミングによると:ビッグオタクランチガイド、CLLocationManagersを返します最後に見つかったデバイスの場所が最初にキャッシュされます。それらのサンプルコードはdidUpdateToLocationタイムスタンプがキャッシュからのものであると仮定して、locationManager:didUpdateToLocation:fromLocationから抜け出します。それは有効な更新の間にかなり長い時間がかかるようですが、たぶんいくつかのテストを行うことだけが知っているでしょう。 メッセージの間にタイムスタンプを残して、キャッシュから位置情報が提供されているかどうかを確認したり、locationManager:didUpdateToLocation:fromLocationの呼び出しごとにカウンタをインクリメントして、奇数番号の呼び出しや他のインクリメントを使用することもできます。 。

関連する問題