在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文件中定义)中读取纬度和经度。
我希望这有助于,实现是在简单的一面,你必须startUpdatingLocation
和stopUpdatingLocation
更新显示。
意见和反馈将受到感谢。
在模拟器上运行时,使用过滤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理器:didUpdateToLocation和locationManager: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文件。