iPhone SimulatorでCoreLocationをテストする
-
03-07-2019 - |
質問
更新: iOS 5およびXcode 4.1では、シミュレーターで場所をテストし、ルートを定義することも可能になりました。詳細については、 http://developer.apple.com をご覧ください。
レガシー質問
とにかくiPhoneシミュレーターでCoreLocationをテストすることはできますか?
必要なのは、自分で場所を設定し、CoreLocationから返せるようにすることです。
解決 2
すばらしいフィードバックに感謝し、堅牢なソリューションを見つけるよう促しました。
すべてのコードはここにあります:
http://code.google.com/p/dlocation/
それは 非常に 乱雑ですが、使用するにつれてずっと良くなります。
解決策は、 CLLocationManager
をサブクラス化し、 DLocationManagerDelegate
という新しいデリゲート @protocol
を定義することでした。
CLLocationManagerDelegate
の簡単なドロップイン置換として設計されており、実際のデバイスに展開すると非常に薄いレイヤーにコンパイルされます。
デバイスで実行すると、 CoreLocation
を使用して通常どおりデータを返しますが、シミュレーターでは、テキストファイル(DLocationManager.hファイルで定義)から緯度と経度を読み取ります。
これが役立つことを願っています。実装が単純な側にあり、表示を更新するには startUpdatingLocation
と stopUpdatingLocation
が必要です。
コメントとフィードバックは感謝されます。
他のヒント
CLLocationMagerを強制的に復帰させる単純なハックです。 パウエルのTech Bookstoreのジオコードは、シミュレーターでのみ:
#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では、オーバーライドせずにクラスの既存のメソッドを replace できる可能性があるようです。これはよく「メソッドスウィズリング」と呼ばれます。 :既存のクラスに独自のカテゴリを定義し、その中に既存のメソッドを実装します。
クライアントの観点から見ると、すべてが透過的です。彼は実際の 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
プロトコルを使用してデリゲートに送信します。
シミュレータが提供する場所以外の場所を設定する必要がある場合は、テストクラスからCore Locationコールバックをトリガーします。
locationManager:didUpdateToLocation および locationManager:didFailedWithError オーバーロードされたコールバックは、iPhoneシミュレーターで呼び出されることはありません。ロンのために。位置として。何かを開発する状況では、シミュレーター環境のみを使用して、ロケーション処理中に発生する可能性のあるすべての状況を実装するのは少し難しいです。
MKMapViewの青いuserLocationドットをシミュレートされた位置の更新で更新する場合は、 http://github.com/futuretap/FTLocationSimulator
Google Earthによって生成されたKMLファイルを読み取り、継続的な位置の更新を提供します。
iPhoneシミュレーターでCoreLocationをテストする
1)シミュレータで場所をテストするには、GPXファイルを使用するのが最善の方法です。ファイル->新規->リソース-> GPXファイル。
2)GPXファイルを追加した後、必要に応じて場所の座標を更新します。
3)GPXファイルをプロジェクトに追加したら、スキーム->を選択します。スキームの編集->実行->ロケーションシミュレーションを許可。ロケーションシミュレーションを選択し、作成したGPXファイルの名前を選択します。
この方法により、シミュレーターは常にGPXファイルに追加した希望の座標を選択します。