更新: iOS 5 および Xcode 4.1 の時点で、シミュレーターで場所をテストしたり、ルートを定義したりできるようになりました。詳細については、 http://developer.apple.comを参照してください。
従来の質問
iPhone Simulator で CoreLocation をテストする方法はありますか?
私が必要とするのは、場所を自分で設定し、CoreLocation がそれを返すようにすることだけです。
更新: iOS 5 および Xcode 4.1 の時点で、シミュレーターで場所をテストしたり、ルートを定義したりできるようになりました。詳細については、 http://developer.apple.comを参照してください。
iPhone Simulator で CoreLocation をテストする方法はありますか?
私が必要とするのは、場所を自分で設定し、CoreLocation がそれを返すようにすることだけです。
CLLocationMager がシミュレーターでのみ Powell's Tech Bookstore の geocoords を返すように強制する私の簡単なハックを次に示します。
#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
次に、この実装では、標準プロトコルを使用してデリゲートに「プッシュ」される事前定義された一連の座標 (任意のファイルから取得) を自由に処理できます。
シミュレーターが提供する場所以外の場所を設定する必要がある場合は、テストクラスからコアロケーションコールバックをトリガーします。
locationManager:didUpdateToLocationとlocationManager:didFailedWithError のオーバーロードされたコールバックは、iPhone シミュレーターで呼び出されることはありません。位置として。何かを開発する状況では、シミュレーター環境だけを使用して、ロケーション処理中に発生する可能性のあるすべての状況を実装するのはちょっと難しいです。
シミュレートされた位置の更新で MKMapView の青い userLocation ドットを更新することに興味がある場合は、http://github.com/futuretap/FTLocationSimulator で私の FTLocationSimulator をチェックしてください。
Google Earth によって生成された KML ファイルを読み取り、継続的な位置情報の更新を提供します。