在iPhone模拟器上testingCoreLocation

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

遗留问题

有没有在iPhone模拟器上testingCoreLocation?

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

这里是我的简单攻击,强制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 

感谢您的宝贵意见,这促使我find一个可靠的解决scheme。

所有的代码可以在这里find:

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

这是非常混乱,但随着我使用它会变得更好。

解决scheme是CLLocationManager子类,并定义一个新的委托@protocol ,称为DLocationManagerDelegate

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

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

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

意见和反馈将受到感谢。

在模拟器上运行时,使用过滤function交换testing实例。 无论你以前收到的位置(代表电话等),通过它:

 + (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 } 

内存pipe理问题搁置…

我认为这里有另一个(更好的恕我直言)的方法比inheritance像CLLocationManager中

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

在ObjectiveC中,似乎有可能从一个类中replace现有的方法而不会覆盖它。 这通常被称为“方法调整”:你为现有的类定义你自己的类,实现一个现有的方法。

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

下面是一个控制客户端将要注入的委托的例子:

@implementation CLLocationManager (simulator) 

@implementation CLLocationManager (simulator)

– (void)setDelegate:(id)delegate {
//你自己实现的setDelegate …
}
– (id)委托{
//你自己的委托实现….
}
– (void)startUpdatingLocation {
}
– (void)stopUpdatingLocation {
}
// ….
//在标准CLLocationManager中可用的任何方法的其余部分相同
@结束

然后在这个实现中,你可以自由地处理预先定义的一组坐标(来自任何文件),这些坐标将被使用标准CLLocationManagerDelegate协议“推送”给委托。

如果您需要设置模拟器所提供的位置以外的其他位置,则从testing类中触发Core Locationcallback。

位置pipe理器:didUpdateToLocationlocationManager:didFailedWithError重载的callback从来没有在iPhone模拟器中调用,这有点奇怪,我得到的是0.0000和0.0000。 作为职位。 在这种情况下,你需要开发一些东西,这很难实现在位置处理过程中可能发生的所有情况,只使用模拟器环境。

如果你有兴趣用模拟的位置更新更新MKMapView中的蓝色userLocation点,请查看我的FTLocationSimulator, url为http://github.com/futuretap/FTLocationSimulator

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

在iPhone模拟器上testingCoreLocation

1)要在模拟器中testing位置,最好的方法是使用GPX文件,只需进入文件 – >新build – >资源 – > GPX文件。

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

3)将GPX文件添加到项目中后,selectscheme – >编辑scheme – >运行 – >允许位置模拟。点击位置模拟并select刚创build的GPX文件的名称。

这种方式模拟器将始终select您想要的坐标,我们已经添加到我们的GPX文件。

创建GPX文件