Вопрос

Обновить: Начиная с iOS 5 и Xcode 4.1, теперь можно тестировать местоположение в симуляторе и даже определять маршруты.Видишь http://developer.apple.com для получения более подробной информации.

Унаследованный Вопрос

Можно ли как-нибудь протестировать CoreLocation на симуляторе iPhone?

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

Это было полезно?

Решение 2

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

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

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

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

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

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

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

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

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

Другие советы

Вот мой простой взлом, который заставляет 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

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

+ (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, как в

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 протокол.

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

тот самый LocationManager:Обновил местоположение и LocationManager:didFailedWithError перегруженные обратные вызовы никогда не вызываются в симуляторе iphone, это довольно странно, все, что я получаю, это 0.0000 для широты и 0.0000 для lon.как должность.В ситуации, когда вы что-то разрабатываете, довольно сложно реализовать все возможные ситуации, которые могут возникнуть во время обработки местоположения, используя только среду симулятора.

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

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

Тестирование CoreLocation на симуляторе iPhone

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

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

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

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

Create the GPX file

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top