Тестирование CoreLocation на симуляторе iPhone
-
03-07-2019 - |
Вопрос
Обновить: Начиная с 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.