Подтвердить что ты не робот

Тестирование CoreLocation на iPhone Simulator

ОБНОВЛЕНИЕ:. Начиная с iOS 5 и Xcode 4.1 теперь можно проверить местоположение в симуляторе и даже определить маршруты. Подробнее см. http://developer.apple.com.

Устаревший вопрос

Нужно ли протестировать CoreLocation на iPhone Simulator?

Все, что мне нужно, - это установить местоположение самостоятельно и вернуть CoreLocation.

4b9b3361

Ответ 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