在iPhone模拟器上测试CoreLocation

rjs*_*ing 29 iphone cocoa-touch core-location ios

更新:从iOS 5和Xcode 4.1开始,现在可以在模拟器中测试位置,甚至可以定义路线.有关详细信息,请访问http://developer.apple.com.

遗留问题

无论如何在iPhone模拟器上测试CoreLocation?

我需要的是能够自己设置位置并让CoreLocation返回它.

wco*_*ran 20

这是我的简单黑客,迫使CLLocationMager仅在模拟器上返回Powell的Tech Bookstore的地理解决方案:

#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
Run Code Online (Sandbox Code Playgroud)


rjs*_*ing 18

感谢您的反馈,它促使我找到了一个强大的解决方案.

所有代码都可以在这里找到:

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

非常混乱,但随着我的使用它会变得更好.

解决方案是子类化CLLocationManager并定义一个@protocol名为的新委托DLocationManagerDelegate.

它被设计成一个简单的替代品,CLLocationManagerDelegate可以在实际设备上部署时编译为非常薄的层.

在设备上运行时,它将正常返回数据CoreLocation,但在模拟器中,它将从文本文件(在DLocationManager.h文件中定义)中读取纬度和经度.

我希望这有帮助,实现是简单的一面,你必须startUpdatingLocationstopUpdatingLocation更新显示.

将非常感谢您的意见和反馈.

  • 看看我的答案.我是开源的FTLocationSimulator,它从Google Earth生成的KML文件中读取其位置更新.它还更新了"MKMapView"的蓝色用户位置点. (2认同)

Nic*_*eys 13

在模拟器上运行时,使用过滤功能交换测试实例.无论您以前收到过哪个位置(代表电话等),都要通过以下方式:

+ (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
}
Run Code Online (Sandbox Code Playgroud)

内存管理问题不谈......

  • 出于好奇,你怎么知道2009年4月的wakkawakka? (4认同)
  • 哦,哇 它实际上来自一个布偶字符:http://en.wikipedia.org/wiki/Fozzie_Bear完全不同的含义,其中没有.:) (2认同)

yon*_*nel 9

我认为这里有另一种(更好的恕我直言)方法,而不是继承CLLocationManager

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

在ObjectiveC中,似乎可以从类替换现有方法而不覆盖它.这通常被称为"方法调配":您为现有类定义自己的类别,并在其中定义现有方法.

从客户的角度来看,一切都是透明的:他有一种感觉,他正在处理真实,__CODE__但实际上,你"从中控制了".因此,他不需要处理任何特殊的子类或任何特殊的委托协议:他继续使用与CoreLocation相同的类/协议.

这是一个控制客户端将注入的委托的示例:

__PRE__

然后在此实现中,您可以自由地处理预定义的坐标集(来自任何文件),这些坐标将使用标准__CODE__协议"推送"到委托.