有没有办法手动告诉设备发送重要的位置变更通知,该通知会唤醒为此通知注册的所有应用程序? 这仅用于测试,我意识到这个私有API调用在提交到应用商店时会被拒绝。
答案 0 :(得分:188)
所以有两个答案:
A)搭乘火车: - )
B)使用模拟器。在iOS 5.x模拟器中,有一个具有位置子菜单的调试菜单。选择高速公路驾驶。这将启动模拟器,沿着加利福尼亚州北部风景秀丽的280号进行假想。它为您提供了除视图之外的所有内容:您的应用将获得重要位置更改更新,并且如果已暂停,还将在后台启动。
要验证您确实在移动,请在模拟器中启动safari,然后转到maps.google.com并单击“跟踪我的位置”按钮。你应该搬家。
真棒!现在如何调试系统启动的生命周期问题?简单!让xCode等待您的应用程序启动以开始调试。从Scheme菜单中,选择edit scheme。在“运行方案”和“信息”标签中,对于“启动”设置,请选择:“等待My.app启动”。
在模拟器中运行您的应用程序一次,以便它开始监视位置更新,然后强制退出它,以便它被暂停。 在应用程序中添加断点确实完成启动功能,然后等待。一旦你的模拟器走得足够远,你的应用程序就会被唤醒,你的断点被击中,而且你有钱。
但实际上,乘坐火车更有趣。
答案 1 :(得分:17)
好吧,我发现我可以通过切换飞机模式和/或WiFi进行切换。也许在飞行模式下使用设备启动应用程序,然后关闭应用程序并关闭飞行模式。这将打开GPS并强制发送位置更新。
答案 2 :(得分:4)
我还想测试我终止的应用程序的重新启动,该应用程序使用重要的变更监控。我编写了一段代码,以便在启动选项字典中的位置键启动时显示本地通知。
我在模拟器中运行了我的应用程序。然后从多任务栏中杀死它。然后我将iOS模拟器的位置设置为自定义位置。我退出了模拟器并再次启动它。我的应用收到了重要的位置更新,并显示了本地通知。
答案 3 :(得分:3)
我正在努力解决同样的问题,如何测试' startMonitoringSignificantLocationChanges'并检查我的应用是否在暂停时接收位置更新。
我无法在断点处捕获执行但我通过将新的位置数据发送到服务器来设法看到我的实现结果。
整个流程: - 使用' startMonitoringSignificantLocationChanges'以及对我的服务器的API调用,以更新位置纬度和经度 - 将位置更新后台模式功能设置为true - 运行应用程序以启动位置管理器,并且应用程序正在侦听位置更改 - 强制关闭应用程序 - 将模拟器上的debug->位置设置为高速公路驱动器 - 打开地图以查看位置是否在变化 - 在服务器上等待查看位置更新,并且每隔约3分钟获得新结果
但是,我仍然不确定这在真实设备上是否足够好。
我正在使用Xcode Version 6.0.1(6A317);在模拟器iPhone 5s(8.0)上测试。
答案 4 :(得分:1)
根据您的情况,我建议两种解决方案:
使用定期调用stopMonitoringSignificantLocationChanges的Timer或LocalNotification,然后调用startMonitoringSignificantLocationChanges,这将触发一个新位置发送到您的代码(可能与之前的位置相同)。
构建您自己的GPS模拟器,您可以在调试版本中启动它,并调用与CLLocationManager相同的委托方法。
答案 5 :(得分:1)
我在iOS 7和Xcode 5.1.1中注意到的一件事 - 如果您希望SLC事件将应用程序启动到后台模式,它可能会也可能不会达到您设置的断点。对我来说,有时甚至没有显示NSLog消息。
如果是这种情况,您可以从系统日志中查看NSLog输出。您可以从iOS模拟器的“调试”菜单中打开系统日志。
答案 6 :(得分:0)
在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];
}
文档说:如果您继续运行此服务并且您的应用程序随后被暂停或终止,则服务会在新位置数据到达时自动唤醒您的应用程序。在唤醒时,您的应用程序将被置于后台并给予少量时间来处理位置数据。由于您的应用程序位于后台,因此应该执行最少的工作并避免任何可能阻止其在分配的时间到期之前返回的任务(例如查询网络)。如果没有,您的申请可能会被终止。
答案 7 :(得分:0)
高速公路驾驶
// MARK: - MKMapViewDelegate
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
guard let location = userLocation.location else { return }
print(location.speed)
}
答案 8 :(得分:0)
添加到MagicSeth的答案中,如果您需要在真实设备上而不是模拟器上进行测试,则可以通过在[常规]> [隐私]屏幕中禁用并重新启用“位置服务”,使用UIApplication.LaunchOptionsKey.location
键触发后台启动。设置应用。
答案 9 :(得分:-4)
嗯,这是不可能的,因为应用程序范围仅限于其自己的空间,并且无法使用Apple Documented API列表生成此类通知。 当然..如果使用任何未记录的API,由于使用了未记录的/私有API,应用程序将被苹果拒绝。