在iPhone模拟器上测试CoreLocation

时间:2009-04-29 12:37:02

标签: ios iphone cocoa-touch core-location

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

遗留问题

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

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

8 个答案:

答案 0 :(得分:20)

这是我强迫CLLocationMager返回的简单黑客攻击 鲍威尔技术书店的地理信息仅在模拟器上:

#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

答案 1 :(得分:18)

感谢您提供了很好的反馈,这促使我找到了一个强大的解决方案。

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

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

非常 凌乱但是当我使用它时会变得更好。

解决方案是继承CLLocationManager并定义一个名为@protocol的新委托DLocationManagerDelegate

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

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

我希望这会有所帮助,但实施方法很简单,您必须startUpdatingLocationstopUpdatingLocation来更新显示。

将非常感激地收到评论和反馈。

答案 2 :(得分: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
}

不考虑内存管理问题......

答案 3 :(得分:9)

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

中那样继承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协议“推送”到委托。

答案 4 :(得分:2)

如果您需要设置模拟器为您提供的位置以外的其他位置,请从测试类触发Core Location回调。

答案 5 :(得分:2)

在iphone模拟器中永远不会调用 locationManager:didUpdateToLocation locationManager:didFailedWithError 重载的回调,这有点奇怪,我得到的是0.0000,对于lat。和0.0000对于lon。作为立场。在您开发某些东西的情况下,仅使用模拟器环境很难实现位置处理期间可能发生的所有情况。

答案 6 :(得分:2)

如果您有兴趣使用模拟位置更新更新MKMapView中的蓝色userLocation点,请在http://github.com/futuretap/FTLocationSimulator

查看我的FTLocationSimulator

它会读取Google地球生成的KML文件,以提供连续的位置更新。

答案 7 :(得分:1)

在iPhone模拟器上测试CoreLocation

1)要在模拟器中测试位置,最好的方法是使用GPX文件,只需转到文件 - >新 - >资源 - > GPX文件。

2)添加GPX文件后,根据需要更新位置坐标。

3)将GPX文件添加到项目后,选择方案 - >编辑方案 - >运行 - >允许位置模拟。点击位置模拟并选择刚刚创建的GPX文件的名称。

这样,模拟器将始终选择我们在GPX文件中添加的所需坐标。

Create the GPX file