iPhone 시뮬레이터에서 CoreLocation 테스트
-
03-07-2019 - |
문제
업데이트: iOS 5 및 Xcode 4.1부터 이제 시뮬레이터에서 위치를 테스트하고 경로를 정의할 수도 있습니다.보다 http://developer.apple.com 상세 사항은.
레거시 질문
어쨌든 iPhone 시뮬레이터에서 CoreLocation을 테스트할 수 있나요?
나에게 필요한 것은 위치를 직접 설정하고 CoreLocation이 이를 반환하도록 하는 것뿐입니다.
해결책 2
훌륭한 피드백에 감사드립니다. 강력한 솔루션을 찾게되었습니다.
모든 코드는 여기에서 찾을 수 있습니다.
http://code.google.com/p/dlocation/
그것은이다 매우 지저분하지만 내가 그것을 사용하면 훨씬 나아질 것입니다.
해결책은 서브 클래스였습니다 CLLocationManager
그리고 새로운 대표를 정의하십시오 @protocol
, 라고 불리는 DLocationManagerDelegate
.
간단한 드롭 인 대체품으로 설계되었습니다. CLLocationManagerDelegate
그것은 a로 컴파일됩니다 매우 실제 장치에 배포 될 때 얇은 층.
장치에서 실행할 때는 데이터를 사용하여 데이터를 다시 반환합니다. CoreLocation
, 그러나 시뮬레이터에서는 텍스트 파일 (dlocationManager.h 파일에 정의 됨)에서 위도와 경도를 읽습니다.
이것이 도움이되기를 바랍니다. 구현이 단순한면에 있으며 startUpdatingLocation
그리고 stopUpdatingLocation
디스플레이를 업데이트합니다.
의견과 피드백은 감사하게 접수됩니다.
다른 팁
다음은 CllocationMager가 Simulator에서만 Powell의 기술 서점의 Geocoords를 반환하도록 강요하는 간단한 해킹입니다.
#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를 하위 클래스로 분류하는 것보다 더 나은 IMHO 접근 방식이 있다고 생각합니다.
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
규약.
시뮬레이터가 제공하는 위치가 아닌 다른 위치를 설정해야 하는 경우 테스트 클래스에서 핵심 위치 콜백을 트리거합니다.
그만큼 LocationManager : didupdatetolocation 그리고 LocationManager : DidFailedWithError 오버로드 된 콜백은 iPhone 시뮬레이터에서 절대로 호출되지 않습니다. 좀 이상합니다. LAT의 경우 0.0000, LON의 경우 0.0000입니다. 위치로. 상황에서 무언가를 개발하면 시뮬레이터 환경 만 사용하여 위치 처리 중에 발생할 수있는 가능한 모든 상황을 구현하기가 어렵습니다.
시뮬레이션 된 위치 업데이트와 함께 MKMapView에서 Blue UserLocation Dot을 업데이트하고 싶다면 ftlocationsImulator에서 확인하십시오. http://github.com/futuretap/ftlocationsimulator
지속적인 위치 업데이트를 제공하기 위해 Google Earth가 생성 한 KML 파일을 읽습니다.