Тестирование CoreLocation на iPhone Simulator - PullRequest
29 голосов
/ 29 апреля 2009

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

Legacy Question

Есть ли способ проверить CoreLocation на симуляторе iPhone?

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

Ответы [ 8 ]

20 голосов
/ 22 июля 2010

Вот мой простой взлом, который заставляет CLLocationMager возвращаться геокорды книжного магазина Powell's Tech только на симуляторе:

#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
18 голосов
/ 01 мая 2009

Спасибо за отличную обратную связь, это побудило меня найти надежное решение.

Весь код можно найти здесь:

http://code.google.com/p/dlocation/

Это очень грязно, но по мере его использования станет намного лучше.

Решением было подкласс CLLocationManager и определение нового делегата @protocol с именем DLocationManagerDelegate.

Он предназначен для простой замены CLLocationManagerDelegate, который при развертывании на реальном устройстве компилируется в тонкий слой очень .

При работе на устройстве он вернет данные в обычном режиме, используя CoreLocation, но в симуляторе он будет считывать широту и долготу из текстового файла (определенного в файле DLocationManager.h).

Надеюсь, это поможет, реализация проста, и вам нужно startUpdatingLocation и stopUpdatingLocation, чтобы обновить дисплей.

Комментарии и отзывы будут с благодарностью приняты.

13 голосов
/ 29 апреля 2009

Используйте функцию фильтрации для замены в тестовом экземпляре при запуске на симуляторе. Везде, где вы ранее получили местоположение (вызов делегата и т. Д.), Передайте его через:

+ (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
}

Проблемы управления памятью в стороне ...

9 голосов
/ 14 января 2010

Я думаю, что здесь есть другой (лучший ИМХО) подход, чем создание подкласса CLLocationManager, как в

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.

2 голосов
/ 27 октября 2010

Если вы заинтересованы в обновлении синей точки userLocation в MKMapView с помощью имитированных обновлений местоположения, проверьте мой FTLocationSimulator на http://github.com/futuretap/FTLocationSimulator

Считывает файл KML, созданный Google Планета Земля, для непрерывного обновления местоположения.

2 голосов
/ 11 октября 2010

locationManager : didUpdateToLocation и locationManager: didFailedWithError перегруженные обратные вызовы никогда не вызываются в симуляторе iphone, это странно, все, что я получаю, это 0,0000 для лат. И 0,0000 для долг. , как позиция. В ситуации, когда вы разрабатываете что-то, довольно сложно реализовать все возможные ситуации, которые могут возникнуть при обработке местоположения, используя только среду симулятора.

2 голосов
/ 29 апреля 2009

Запускает обратные вызовы основного местоположения из тестового класса, если вам нужно установить местоположение, отличное от того, которое дает вам симулятор.

1 голос
/ 30 июня 2017

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

1) Чтобы проверить местоположение в симуляторе, лучше всего использовать файлы GPX, просто зайдите в Файлы -> Создать -> Ресурс -> Файл GPX.

2) После добавления файла GPX обновите координаты местоположения по желанию.

3) после добавления файла GPX в проект выберите Схема -> Редактировать схему -> Выполнить -> Разрешить симуляцию местоположения . Отметьте симуляцию местоположения и выберите имя файла GPX, который вы только что создан.

таким образом, симулятор всегда будет выбирать желаемые координаты, которые мы добавили в наш файл GPX.

Create the GPX file

...