Тестирование CoreLocation на iPhone Simulator
ОБНОВЛЕНИЕ:. Начиная с iOS 5 и Xcode 4.1 теперь можно проверить местоположение в симуляторе и даже определить маршруты. Подробнее см. http://developer.apple.com.
Устаревший вопрос
Нужно ли протестировать CoreLocation на iPhone Simulator?
Все, что мне нужно, - это установить местоположение самостоятельно и вернуть CoreLocation.
Ответы
Ответ 1
Спасибо за отличную обратную связь, это побудило меня найти надежное решение.
Весь код можно найти здесь:
http://code.google.com/p/dlocation/
Это очень грязно, но по мере его использования он станет намного лучше.
Решение заключалось в подклассе CLLocationManager
и определении нового делегата @protocol
, называемого DLocationManagerDelegate
.
Он предназначен для простой замены для CLLocationManagerDelegate
, который скомпилируется на очень тонком уровне при развертывании на реальном устройстве.
При запуске на устройстве он будет возвращать данные как обычно, используя CoreLocation
, но в симуляторе он будет считывать широту и долготу из текстового файла (определенного в файле DLocationManager.h).
Надеюсь, это поможет, реализация выполняется на простой стороне, и вам нужно startUpdatingLocation
и stopUpdatingLocation
обновить отображение.
Комментарии и отзывы будут с благодарностью получены.
Ответ 2
Вот мой простой хак, который заставляет CLLocationMager возвращаться
геокодеры книжного магазина Powell 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
Ответ 3
Используйте функцию фильтрации для замены в тестовом экземпляре при запуске на симуляторе. Где бы вы ранее не получили местоположение (вызов делегата и т.д.), Пройдите через это:
+ (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
}
Проблемы с управлением памятью в стороне...
Ответ 4
Я думаю, что здесь используется другой (лучше IMHO) подход, чем подклассификация CLLocationManager, например, в
http://code.google.com/p/dlocation/
В ObjectiveC представляется возможным заменить существующий метод из класса без его переопределения. Это часто называют "метод swizzling": вы определяете свою собственную категорию для существующего класса, реализуете существующий в ней метод.
С точки зрения клиента все прозрачно: у него есть ощущение, что он имеет дело с реальным CLLocationManager
, но на самом деле вы "взяли у него контроль" . Так что ему не нужно иметь дело с каким-либо специальным подклассом или любым специальным протоколом делегирования: он продолжает использовать тот же класс/протокол, что и тот, который из CoreLocation.
Вот пример, чтобы взять контроль над делегатом, который клиент будет вводить:
@implementation CLLocationManager (симулятор)
- (void) setDelegate: (id) delegate { // ваша собственная реализация setDelegate...
}
- (id) делегат { // Ваша собственная реализация делегата....
}
- (void) startUpdatingLocation {
}
- (void) stopUpdatingLocation {
}
//....
// тот же для остальной части любого метода, доступного в стандартном CLLocationManager
@конец
Затем в этой реализации вы можете иметь дело с предварительно определенным набором координат (поступающим из файла любого типа), который будет "выдвинут" делегату, используя стандартный протокол CLLocationManagerDelegate
.
Ответ 5
Запускать обратные вызовы Core Location из тестового класса, если вам нужно установить другое место, отличное от того, которое дает вам симулятор.
Ответ 6
locationManager: didUpdateToLocation и locationManager: didFailedWithError перегруженные обратные вызовы никогда не вызываются в симуляторе iphone, это странно, все, что я получаю, составляет 0.0000 для lat. и 0.0000 для lon. как позиция. В ситуации вы что-то развиваете, что трудно реализовать все возможные ситуации, которые могут возникнуть во время обработки местоположения, используя только среду симулятора.
Ответ 7
Если вам интересно обновить синюю точку userLocation в MKMapView с имитируемыми обновлениями местоположения, проверьте мой FTLocationSimulator на http://github.com/futuretap/FTLocationSimulator
Он читает KML файл, созданный Google Earth, для обеспечения непрерывных обновлений местоположения.
Ответ 8
Тестирование CoreLocation на iPhone Simulator
1) Чтобы проверить местоположение в симуляторе, лучше всего использовать файлы GPX, просто перейдите в Файлы → Создать → Ресурс → Файл GPX.
2) После добавления обновления GPX файла координаты местоположения по желанию.
3) после добавления файла GPX в проект, выберите Схема → Изменить схему → Выполнить → Разрешить определение местоположения. Выберите симуляцию местоположения и выберите имя файла GPX вы только что создали.
таким образом симулятор всегда будет выбирать нужные координаты, которые мы добавили в наш GPX файл.
![Создать файл GPX]()