UPDATE:iOS5およびXcode4.1以降、シミュレーターで位置をテストし、ルートを定義することも可能になりました。詳細については、 http://developer.Apple.com を参照してください。
IPhoneシミュレータでCoreLocationをテストする方法はありますか?
必要なのは、自分で場所を設定し、CoreLocationに返してもらうことだけです。
素晴らしいフィードバックをありがとう、それは私に強力な解決策を見つけるように促しました。
すべてのコードはここにあります:
http://code.google.com/p/dlocation/
それは非常に厄介ですが、私がそれを使用するにつれて、それははるかに良くなるでしょう。
解決策は、CLLocationManager
をサブクラス化し、DLocationManagerDelegate
と呼ばれる新しいデリゲート@protocol
を定義することでした。
これは、実際のデバイスにデプロイされたときに非常に薄いレイヤーにコンパイルされるCLLocationManagerDelegate
の単純なドロップイン置換として設計されています。
デバイスで実行すると、CoreLocation
を使用して通常どおりデータが返されますが、シミュレーターでは、テキストファイル(DLocationManager.hファイルで定義)から緯度と経度が読み取られます。
これがお役に立てば幸いです。実装は単純な側であり、表示を更新するにはstartUpdatingLocation
とstopUpdatingLocation
を実行する必要があります。
コメントやフィードバックをいただければ幸いです。
これは、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
シミュレーターで実行する場合は、フィルタリング機能を使用してテストインスタンスをスワップします。以前に場所を受け取った場所(デリゲートコールなど)は、次の場所に渡します。
+ (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
}
メモリ管理の問題はさておき...
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
プロトコルを使用してデリゲートに「プッシュ」される、事前定義された座標のセット(任意のファイルから取得)を自由に処理できます。
シミュレートされた場所の更新でMKMapViewの青いuserLocationドットを更新することに興味がある場合は、私のFTLocationSimulatorをチェックしてください http://github.com/futuretap/FTLocationSimulator
Google Earthによって生成されたKMLファイルを読み取り、継続的な位置の更新を提供します。
locationManager:didUpdateToLocationおよびlocationManager:didFailedWithErrorオーバーロードされたコールバックはiphoneシミュレーターでは呼び出されません。これはちょっと奇妙なことです。取得するのは、緯度が0.0000、経度が0.0000だけです。位置として。何かを開発する状況では、シミュレーター環境のみを使用して、ロケーション処理中に発生する可能性のあるすべての状況を実装するのは少し難しいです。
シミュレーターが提供する場所以外の場所を設定する必要がある場合は、テストクラスからコアロケーションコールバックをトリガーします。