web-dev-qa-db-ja.com

iPhoneシミュレータでCoreLocationをテストする

UPDATE:iOS5およびXcode4.1以降、シミュレーターで位置をテストし、ルートを定義することも可能になりました。詳細については、 http://developer.Apple.com を参照してください。

レガシー質問

IPhoneシミュレータでCoreLocationをテストする方法はありますか?

必要なのは、自分で場所を設定し、CoreLocationに返してもらうことだけです。

29
rjstelling

素晴らしいフィードバックをありがとう、それは私に強力な解決策を見つけるように促しました。

すべてのコードはここにあります:

http://code.google.com/p/dlocation/

それは非常に厄介ですが、私がそれを使用するにつれて、それははるかに良くなるでしょう。

解決策は、CLLocationManagerをサブクラス化し、DLocationManagerDelegateと呼ばれる新しいデリゲート@protocolを定義することでした。

これは、実際のデバイスにデプロイされたときに非常に薄いレイヤーにコンパイルされるCLLocationManagerDelegateの単純なドロップイン置換として設計されています。

デバイスで実行すると、CoreLocationを使用して通常どおりデータが返されますが、シミュレーターでは、テキストファイル(DLocationManager.hファイルで定義)から緯度と経度が読み取られます。

これがお役に立てば幸いです。実装は単純な側であり、表示を更新するにはstartUpdatingLocationstopUpdatingLocationを実行する必要があります。

コメントやフィードバックをいただければ幸いです。

18
rjstelling

これは、CLLocationMagerがシミュレーター上でのみPowell's TechBookstoreのジオコードを返すように強制する私の単純なハックです。

#ifdef TARGET_IPHONE_SIMULATOR 

@interface CLLocationManager (Simulator)
@end

@implementation CLLocationManager (Simulator)

-(void)startUpdatingLocation {
    CLLocation *powellsTech = [[[CLLocation alloc] initWithLatitude:45.523450 longitude:-122.678897] autorelease];
    [self.delegate locationManager:self
               didUpdateToLocation:powellsTech
                      fromLocation:powellsTech];    
}

@end

#endif // TARGET_IPHONE_SIMULATOR
20
wcochran

シミュレーターで実行する場合は、フィルタリング機能を使用してテストインスタンスをスワップします。以前に場所を受け取った場所(デリゲートコールなど)は、次の場所に渡します。

+ (CLLocation *) wakkawakka: (CLLocation*) loc {
#ifdef TARGET_IPHONE_SIMULATOR
    /* replace with a test instance */
    return [[CLLocation alloc] initWithLatitude:10.0 longitude:20.0];
#else
    return loc;
#endif
}

メモリ管理の問題はさておき...

13
Nick Veys

CLLocationManagerをサブクラス化するよりも別の(より良いIMHO)アプローチがあると思います

http://code.google.com/p/dlocation/

ObjectiveCでは、次のことが可能であるようです。 交換 クラスからの既存のメソッドをオーバーライドせずに。これは「メソッドスウィズリング」と呼ばれることがよくあります。既存のクラスに独自のカテゴリを定義し、その中に既存のメソッドを実装します。

クライアントの観点からは、すべてが透過的です。 彼は本物のCLLocationManagerを扱っているような気がしますが、実際には、あなたは「それから制御を取りました」。そのため、彼は特別なサブクラスや特別なデリゲートプロトコルを扱う必要がありません。彼は、CoreLocationのものと同じクラス/プロトコルを使い続けています。

クライアントが挿入するデリゲートを制御する例を次に示します。

 
@implementation CLLocationManager (simulator) 


-(void) setDelegate:(id)delegate { //your own implementation of the setDelegate... } -(id)delegate { //your own implementation of the delegate.... } -(void)startUpdatingLocation { } -(void)stopUpdatingLocation { } //.... //same for the rest of any method available in the standard CLLocationManager @end

次に、この実装では、標準のCLLocationManagerDelegateプロトコルを使用してデリゲートに「プッシュ」される、事前定義された座標のセット(任意のファイルから取得)を自由に処理できます。

9
yonel

シミュレートされた場所の更新でMKMapViewの青いuserLocationドットを更新することに興味がある場合は、私のFTLocationSimulatorをチェックしてください http://github.com/futuretap/FTLocationSimulator

Google Earthによって生成されたKMLファイルを読み取り、継続的な位置の更新を提供します。

2
Ortwin Gentz

locationManager:didUpdateToLocationおよびlocationManager:didFailedWithErrorオーバーロードされたコールバックはiphoneシミュレーターでは呼び出されません。これはちょっと奇妙なことです。取得するのは、緯度が0.0000、経度が0.0000だけです。位置として。何かを開発する状況では、シミュレーター環境のみを使用して、ロケーション処理中に発生する可能性のあるすべての状況を実装するのは少し難しいです。

2
cybercow

シミュレーターが提供する場所以外の場所を設定する必要がある場合は、テストクラスからコアロケーションコールバックをトリガーします。

iPhoneシミュレーターでのCoreLocationのテスト

1)シミュレータで場所をテストするには、GPXファイルを使用するのが最善の方法です。ファイル->新規->リソース-> GPXファイルに移動します。

2)GPXファイルを追加した後、必要に応じて位置座標を更新します。

3)GPXファイルがプロジェクトに追加されたら、スキーム->スキームの編集->実行->ロケーションシミュレーションを許可を選択します。ロケーションシミュレーションにチェックマークを付けます。作成したGPXファイルの名前を選択します。

このようにして、シミュレーターは、GPXファイルに追加した希望の座標を常に選択します。

Create the GPX file

1
Dhaval Mistry