XCode / iOS模拟器:手动触发重要的位置更改
是否有办法手动告诉设备发送重要的位置更改通知,以唤醒为此通知注册的所有应用程序? 这只是为了testing,我意识到这个私人API调用将被提交到应用程序商店被拒绝。
所以有两个答案:
A)跳上火车:-)
B)使用模拟器。 在iOS 5.x模拟器中,有一个具有位置子菜单的debugging菜单。 select高速公路驱动器。 这将启动模拟器在加利福尼亚州北部的风景名胜280下的想象的旅程。 它给你一切,但视图:你的应用程序将获得重大的位置更改更新 ,并将在后台启动,如果它已被暂停。
要validation您确实正在移动,请在模拟器中启动Safari,然后转至maps.google.com,然后单击“我的位置”button。 你应该移动。
真棒! 现在如何debugging系统启动的生命周期问题? 简单! 让xCode等待您的应用程序启动以开始debugging。 从Scheme菜单中select编辑scheme。 在“运行scheme”和“信息”选项卡中,对于“启动”设置,请select“ 等待My.app启动 ”。
在模拟器中运行一次您的应用程序,以便它开始监视位置更新,然后强制退出它,以便它被挂起。 在您的应用程序添加一个断点完成启动function,并等待。 只要你的模拟器已经足够了,你的应用程序就会被唤醒,你的断点就会被触发,而你的钱就会被占用。
但真的,坐火车更有趣。
那么,我发现我可以通过打开和closures机场模式和/或WiFi来做到这一点。 也许用飞行模式启动应用程序,然后closures应用程序并closures飞行模式。 这将打开GPS并强制更新位置。
我也想testing重新启动我的终止的应用程序,使用重大的变化监测。 我写了一段代码,以便在启动选项字典中的位置键启动时显示本地通知。
我在模拟器中运行我的应用程序。 然后从多任务栏中杀死它。 然后我将iOS模拟器的位置设置为自定义位置。 我退出模拟器并重新启动。 我的应用程序收到重要的位置更新,并显示本地通知。
我正在努力解决同样的问题,如何testing'startMonitoringSignificantLocationChanges',并检查我的应用程序是否在暂停时接收位置更新。
我无法捕捉执行的断点,但我设法看到我的实施结果,通过发送新的位置数据到服务器。
整个stream程: – 执行“startMonitoringSignificantLocationChanges”和一个API调用我的服务器更新位置的经纬度 – 设置位置更新后台模式能力为真 – 运行应用程序,所以位置pipe理器启动,应用程序正在侦听位置更改 – 强制closures应用程序 – 将模拟器上的debug->位置设置为高速公路驱动器 – 打开地图查看位置是否正在改变 – 等待服务器查看位置更新,并且每约3分钟获得新结果
但是,我仍然不确定这是否足够好在一个真正的设备上。
我正在使用Xcode版本6.0.1(6A317); 在模拟器iPhone 5s(8.0)上testing。
根据你的情况,我会build议两个解决scheme:
-
使用定时器或LocalNotification定期调用stopMonitoringSignificantLocationChanges,然后是startMonitoringSignificantLocationChanges,这应该触发一个新的位置发送到您的代码(可能与以前相同的位置)。
-
构build您自己的GPS模拟器,您可以在debugging版本中启动,并调用像CLLocationManager一样的委托方法。
在iOS 7和Xcode 5.1.1中我注意到了一件事情 – 如果您希望SLC事件触发您的应用程序进入后台模式,它可能会或可能不会触发您设置的断点。 对我而言,有时甚至没有显示NSLog消息。
如果是这种情况,您可以查看系统日志中的NSLog输出。 您可以从iOS模拟器的debugging菜单中打开系统日志。
在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];
}
该文档说:如果您保持此服务正在运行,并且您的应用程序随后被暂停或终止,则服务会在新的位置数据到达时自动唤醒您的应用程序。 在起床时,您的应用程序将被放入后台,并给予less量时间来处理位置数据。 因为你的应用程序在后台,所以它应该做最less的工作,并避免任何可能阻止它在分配的时间到期之前返回的任务(如查询networking)。 如果没有,您的申请可能会被终止。
高速公路驱动器
// MARK: - MKMapViewDelegate func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) { guard let location = userLocation.location else { return } print(location.speed) }
那么,这是不可能的,因为应用程序范围被限制在自己的空间,这种types的通知无法使用Apple Documented API列表生成。 当然,如果使用任何未公开的API,由于使用无证/私有API,应用程序将被拒绝。