문제

업데이트: 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 파일을 읽습니다.

iPhone 시뮬레이터에서 CoreLocation 테스트

1) 시뮬레이터에서 위치를 테스트하려면 GPX 파일을 사용하는 것이 가장 좋습니다. 파일 -> 새로 만들기 -> 리소스 -> GPX 파일.

2) GPX 파일을 추가한 후 원하는 대로 위치 좌표를 업데이트합니다.

3) GPX 파일이 프로젝트에 추가되면 구성표 -> 구성표 편집 -> 실행 -> 위치 시뮬레이션 허용.위치 시뮬레이션을 선택하고 방금 생성한 GPX 파일의 이름을 선택합니다.

이런 식으로 시뮬레이터는 항상 GPX 파일에 추가한 원하는 좌표를 선택합니다.

Create the GPX file

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top