有没有办法手动告诉设备发送重要的位置更改通知,该通知将唤醒为此通知注册的所有应用程序?这仅用于测试,我知道此私有API调用在提交到应用商店后会被拒绝。
有没有办法手动告诉设备发送重要的位置更改通知,该通知将唤醒为此通知注册的所有应用程序?这仅用于测试,我知道此私有API调用在提交到应用商店后会被拒绝。
Answers:
有两个答案:
A)跳上火车:-)
B)使用模拟器。在iOS 5.x模拟器中,有一个带有位置子菜单的调试菜单。选择高速公路。这将使模拟器沿着想象中的北加州风景秀丽的280开始。它为您提供除视图之外的所有内容:您的应用将获得“重要的位置更改”更新,并且如果已暂停,它还将在后台启动。
要验证您是否确实在移动,请在模拟器中启动safari,然后转到maps.google.com,然后点击跟踪我的位置按钮。你应该搬家。
太棒了!现在如何调试系统启动的生命周期问题?简单!让xCode等待您的应用程序启动以开始调试。从方案菜单中,选择编辑方案。在“运行方案”和“信息”选项卡中,为“启动”设置选择:“等待My.app启动”。
在模拟器中运行一次您的应用程序,以便它开始监视位置更新,然后强制退出它,以便将其挂起。 在您的应用程序中添加一个断点确实完成了启动功能,然后等待。一旦您的模拟器足够远,您的应用程序将被唤醒,断点被击中,您就可以赚钱。
但实际上,乘火车更有趣。
好吧,我发现我可以通过切换飞行模式和/或WiFi来实现。也许以设备在飞行模式下启动应用程序,然后关闭应用程序并关闭飞行模式。这将打开GPS并强制发送位置更新。
我一直在同一个问题上挣扎,如何测试“ startMonitoringSignificantLocationChanges”并检查我的应用在暂停时是否正在接收位置更新。
我无法在断点上捕获执行,但是通过将新的位置数据发送到服务器,我设法看到了实现的结果。
整个流程:-通过“ startMonitoringSignificantLocationChanges”和对我的服务器的API调用来实现,以更新位置纬度和经度-将位置更新背景模式功能设置为true-运行该应用,以便启动位置管理器,并且该应用正在监听位置更改-强制关闭应用程序-将模拟器上的debug-> location设置为高速公路驱动器-打开地图以查看位置是否正在更改-等待服务器上的位置更新,每3分钟获取一次新结果
但是,我仍然不确定在实际设备上是否足够好。
我正在开发Xcode 6.0.1(6A317);在模拟器iPhone 5s(8.0)上进行了测试。
根据您的情况,我建议两种解决方案:
使用一个Timer或LocalNotification,它定期调用stopMonitoringSignificantLocationChanges,然后依次调用startMonitoringSignificantLocationChanges,这将触发将新位置发送到您的代码(可能与以前的位置相同)。
建立您自己的GPS模拟器,该模拟器将在调试版本中开始,并将调用与CLLocationManager相同的委托方法。
在iOS 4中,您可以注册以进行重大位置更改。从Apple文档:使用此服务,仅当用户的位置发生显着变化时才生成位置更新;因此,对于社交应用程序或为用户提供非关键的,与位置相关的信息的应用程序而言,它是理想的选择。如果在发生更新时挂起了应用程序,则系统会在后台将其唤醒以处理更新。如果应用程序启动了该服务然后又终止了,那么当新位置可用时,系统会自动重新启动应用程序。此服务仅在包含蜂窝无线电的设备上在iOS 4和更高版本中可用。
这是一些用于注册指示性位置更新的示例代码:
- (void)startSignificantChangeUpdates {
// Create the location manager if it doesn't exist
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];
}
文档说:如果让此服务运行,并且您的应用程序随后被挂起或终止,则当新的位置数据到达时,该服务会自动唤醒您的应用程序。在唤醒时,您的应用程序将被置于后台,并留出少量时间来处理位置数据。因为您的应用程序在后台,所以它应该做的工作最少,并且避免任何可能阻止其在分配的时间到期之前返回的任务(例如查询网络)。否则,您的应用程序可能会终止。
好吧,这是不可能的,因为应用程序范围仅限于其自己的空间,并且此类通知无法通过Apple Documented API列表生成。当然..如果使用了任何未公开的API,由于使用了未公开的/私有API,应用程序将被苹果拒绝。