有没有一种方式可以手动告诉设备触发一个显著位置变化通知,以唤醒所有注册了该通知的应用程序? 这仅用于测试,我意识到此私有API调用将在提交到应用商店时被拒绝。
有没有一种方式可以手动告诉设备触发一个显著位置变化通知,以唤醒所有注册了该通知的应用程序? 这仅用于测试,我意识到此私有API调用将在提交到应用商店时被拒绝。
所以有两个答案:
A) 上火车 :-)
B) 使用模拟器。在iOS 5.x 模拟器中,有一个调试菜单,其中包含位置子菜单。选择高速公路驾驶。这将在北加利福尼亚州风景优美的280号公路上开始模拟器的想象之旅。它为您提供了除了视图以外的一切:您的应用程序将获得重大位置更改更新 ,如果它已被暂停,还将在后台启动。
为了验证您是否实际移动,请在模拟器中启动 Safari,转到 maps.google.com 并单击小的跟踪我的位置按钮。您应该在移动。
太棒了!现在如何调试被系统启动的生命周期问题?简单!让 xCode 等待您的应用程序启动以开始调试。从方案菜单中选择编辑方案。在运行方案和信息选项卡中,对于“启动”设置,选择:“等待 My.app 启动”。
在模拟器中运行您的应用程序一次,以便开始监视位置更新,然后强制退出它,以使其挂起。在应用程序完成启动函数中添加一个断点,然后等待。只要您的模拟器足够远,您的应用程序将被唤醒,触发您的断点,您就可以获得想要的。
但实际上,坐火车更有趣。
我发现可以通过打开和关闭飞行模式和/或WiFi来实现这一点。也许可以在设备处于飞行模式下启动应用程序,然后关闭应用程序并关闭飞行模式。这将打开GPS并强制分派位置更新。
我还想测试我已终止的应用程序的重新启动,该应用程序使用了重要更改监视。我编写了一段代码,以便在启动选项字典中使用位置密钥启动时显示本地通知。
我在模拟器中运行了我的应用程序。然后从多任务栏中将其关闭。然后我将iOS模拟器的位置设置为自定义位置。我退出模拟器并重新启动它。我的应用程序接收到了重要的位置更新并显示了本地通知。
除了MagicSeth的答案,如果您需要在真实设备上测试而不是模拟器上,您可以通过在设置应用程序中的隐私屏幕中禁用并重新启用位置服务,并使用UIApplication.LaunchOptionsKey.location
密钥触发后台启动。
使用定时器或本地通知,定期调用stopMonitoringSignificantLocationChanges,然后再调用startMonitoringSignificantLocationChanges,这应该会触发将新位置发送到您的代码(可能与之前相同的位置)。
构建自己的GPS模拟器,在调试版本中启动,并调用与CLLocationManager相同的委托方法。
- (void)startSignificantChangeUpdates {
// Create the location manager if it doesn't exist
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];
}
文档中提到:如果您让此服务保持运行状态,而您的应用程序随后被挂起或终止,该服务会在新位置数据到达时自动唤醒您的应用程序。在唤醒时,您的应用程序被放置在后台,并被分配一小段时间来处理位置数据。由于您的应用程序在后台运行,因此它应该尽量减少工作量,并避免任何可能导致其在分配的时间到期之前无法返回的任务(例如查询网络)。如果没有这样做,您的应用程序可能会被终止。嗯,这是不可能的,因为应用程序范围仅限于其自己的空间,这种类型的通知不能使用苹果文档化的API列表生成。 当然...如果使用了任何未经记录的API,应用程序将因使用未记录/私有API而被苹果拒绝。