在iPhone模拟器上测试CoreLocation
-
03-07-2019 - |
题
更新:从iOS 5开始,Xcode 4.1现在可以测试模拟器中的位置,甚至可以定义路线。有关详细信息,请参见 http://developer.apple.com 。
遗留问题
无论如何都要在iPhone模拟器上测试CoreLocation吗?
我需要的是能够自己设置位置并让CoreLocation返回它。
解决方案 2
感谢您提供了很好的反馈,这促使我找到了一个强大的解决方案。
所有代码都可以在这里找到:
http://code.google.com/p/dlocation/
非常 凌乱但是当我使用它时会变得更好。
解决方案是继承 CLLocationManager
并定义一个新的委托 @protocol
,名为 DLocationManagerDelegate
。
它被设计为 CLLocationManagerDelegate
的简单替代品,当部署在实际设备上时,它会编译为非常薄层。
在设备上运行时,它将使用 CoreLocation
正常返回数据,但在模拟器中,它将从文本文件(在DLocationManager.h文件中定义)读取纬度和经度。
我希望这有帮助,实现很简单,你必须 startUpdatingLocation
和 stopUpdatingLocation
来更新显示。
将非常感激地收到评论和反馈。
其他提示
这是我强迫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
在模拟器上运行时,使用过滤功能交换测试实例。无论您以前在哪里收到过该位置(代表电话等),请通过以下方式传递:
+ (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
}
不考虑内存管理问题......
我认为这里有另一种(更好的恕我直言)方法,而不是像
中那样继承CLLocationManagerhttp://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
协议到委托。
如果您需要设置模拟器为您提供的位置以外的其他位置,请从测试类触发Core Location回调。
如果您对使用模拟位置更新更新MKMapView中的蓝色userLocation点感兴趣,请查看我的FTLocationSimulator http://github.com/futuretap/FTLocationSimulator
它会读取Google地球生成的KML文件,以提供连续的位置更新。