在iPhone模拟器上模拟位置更新

ste*_*nos 23 iphone xcode core-location ios ios-simulator

我想允许用户通过GUI在iPhone模拟器上设置GPS信息.

但我不确定如何实现这一点 - 似乎这个名为iSimulate的工具通过安装自己的SDK以某种方式做到这一点.但我无法弄清楚他们是如何"覆盖"/"破解"模拟器的.

谢谢!

Ort*_*ntz 47

添加了第二个答案,因为Xcode中现在有集成功能(≥4.2).有两种方法可以模拟位置更新:

  • 在iOS模拟器中,在"调试/位置"下,您可以指定恒定的纬度/经度或选择几个预定义的配置文件,如"城市运行"或"高速公路驱动器".
  • 在Xcode中,调试器中有一个新的位置图标,紧邻Step Out按钮.它允许您选择全球多个硬编码城市,并为您的项目添加自定义GPX文件.关于Xcode中位置模拟的好处是它也适用于设备(​​只是不要忘记再次关闭它,否则你的自动时区将是错误的!).自定义GPX文件也很好,但如果无法识别GPX文件,它有时会崩溃Xcode.确保<wpt>仅使用标签:
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode"> 
  <wpt lat="47.52789018096815" lon="7.385249894876031"></wpt>
  <wpt lat="47.52720984945248" lon="7.382647784661411"></wpt>
  ...
</gpx>
Run Code Online (Sandbox Code Playgroud)


wjl*_*wjl 12

iOS模拟器内置了完整的位置模拟.从"调试"菜单中,您可以浏览各种位置选项.


在NDA下发布的原始答案.

查看此页面右下角的条目.我在NDA之下所以我不能说什么,除了它为我节省了大量的汽油钱.:)

1:http://developer.apple.com/technologies/ios5/


ben*_*ado 11

据我所知,iSimulate没有采用任何黑客攻击.它是在模拟器上的应用程序内运行的代码,它通过网络与设备通信.当它从设备接收消息(触摸,GPS,加速)时,它通过调用应用程序的代码来模拟这些事件,就像系统触发它们一样.

例如,要接收GPS位置更新,您必须创建CLLocationManager的实例,然后将其中一个类配置为其委托.好吧,在iPhone模拟器上,您可以改为启动代码,将代码发送给您的代理.如果你只是像这样调用委托的方法:

[delegate locationManager:nil didUpdateToLocation:newLocation fromLocation:oldLocation];
Run Code Online (Sandbox Code Playgroud)

您的代码不必知道位置更新是假的.如果你想得到花哨的话,你可以创建一个新的类来实现CLLocationManager的所有公共方法,但是它会发送伪造的消息.(由于Objective-C是动态类型的,因此它不需要是子类,只要它响应您发送的所有消息.)

作为旁注,您可以使用这些编译器宏来保持代码模拟器:

#if TARGET_IPHONE_SIMULATOR
   locationManager = (id)[[MyFakeLocationManager alloc] init];
#else
   locationManager = [[CLLocationManager alloc] init];
#endif
Run Code Online (Sandbox Code Playgroud)


Ort*_*ntz 7

您可以在http://github.com/futuretap/FTLocationSimulator上查看我的FTLocationSimulator

它会读取Google地球生成的KML文件,以提供连续的位置更新.它还使用模拟的位置更新更新MKMapView中的蓝色userLocation点.