繁体   English   中英

Xcode / iOS 模拟器:手动触发重大位置变化

[英]Xcode / iOS simulator: Trigger significant location change manually

有没有办法手动告诉设备发送重要的位置更改通知,以唤醒为此通知注册的任何应用程序? 这仅用于测试,我意识到这个私有 API 调用在提交到应用商店时会被拒绝。

所以两个答案:

A) 跳上火车:-)

B) 使用模拟器。 在 iOS 5.x 模拟器中,有一个带有位置子菜单的调试菜单。 选择高速公路。 这将在北加州风景秀丽的 280 号公路上启动模拟器。 它为您提供除视图之外的所有内容:您的应用将获得重要的位置更改更新,并且如果它已暂停,也将在后台启动

要验证您是否真的在移动,请在模拟器中启动 safari,然后将 go 启动到 maps.google.com 并单击小跟踪我的位置按钮。 你应该搬家了。

惊人的? 现在如何调试系统启动的生命周期问题。 简单,让 xCode 等待您的应用程序启动以开始调试。 从方案菜单中,选择编辑方案,在运行方案:和信息选项卡中,为“启动”设置选择:“等待 My.app 启动”。

在模拟器中运行您的应用程序一次,以便它开始监视位置更新,然后强制退出它,使其暂停。 在您的应用程序中添加一个断点并完成启动 function,然后等待。 一旦你的模拟器运行得足够远,你的应用程序就会被唤醒,你的断点被命中,你就赢了。

但实际上,坐火车更有趣。

好吧,我发现我可以通过打开和关闭飞行模式和/或 WiFi 来做到这一点。 也许在设备处于飞行模式时启动应用程序,然后关闭应用程序并关闭飞行模式。 这将打开 GPS 并强制发送位置更新。

我还想测试使用重大变更监控的已终止应用程序的重新启动。 我编写了一段代码,以便在通过启动选项字典中的位置键启动时显示本地通知。

我在模拟器中运行了我的应用程序。 然后从多任务栏中杀死它。 然后我将 iOS 模拟器的位置设置为自定义位置。 我退出模拟器并重新启动它。 我的应用收到了重要的位置更新并显示了本地通知。

我在同一个问题上苦苦挣扎,如何测试“startMonitoringSignificantLocationChanges”并检查我的应用程序是否在暂停时接收位置更新。

我无法在断点处捕获执行,但我设法通过将新的位置数据发送到服务器来查看我的实现结果。

整个流程: - 使用“startMonitoringSignificantLocationChanges”和 API 调用我的服务器来更新位置纬度和经度 - 将位置更新后台模式功能设置为 true - 运行应用程序,以便启动位置管理器并且应用程序正在侦听位置更改 - 强制关闭应用程序 - 将模拟器上的调试 -> 位置设置为高速公路驱动 - 打开地图以查看位置是否正在更改 - 在服务器上等待以查看位置更新,并且每大约 3 分钟获得一次新结果

但是,我仍然不确定这在真实设备上是否足够好。

我正在研究 Xcode 版本 6.0.1 (6A317); 在模拟器 iPhone 5s (8.0) 上测试。

我在 iOS 7 和 Xcode 5.1.1 中注意到的一件事 - 如果您期望 SLC 事件将您的应用程序启动到后台模式,它可能会或可能不会达到您设置的断点。 对我来说,有时甚至没有显示 NSLog 消息。

如果您遇到这种情况,您可以从系统日志中查看 NSLog 输出。 您可以从 iOS 模拟器的调试菜单中打开系统日志。

添加到MagicSeth的答案中,如果您需要在真实设备而不是模拟器上进行测试,您可以通过在“设置”应用程序中的“常规”>“隐私”屏幕中禁用和重新启用定位服务来使用UIApplication.LaunchOptionsKey.location键触发后台启动.

根据您的情况,我会建议两种解决方案:

  1. 使用 Timer 或 LocalNotification 定期调用 stopMonitoringSignificantLocationChanges 后跟 startMonitoringSignificantLocationChanges 应该触发一个新位置发送到您的代码(可能与以前的位置相同)。

  2. 构建您自己的 GPS 模拟器,您从调试构建开始,它将调用与 CLLocationManager 相同的委托方法。

高速公路驱动器

在此处输入图像描述

// MARK: - MKMapViewDelegate

  func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
    guard let location = userLocation.location else { return }

    print(location.speed)
  }

在 iOS 4 中,您可以注册重大位置更改。 来自 Apple 文档:使用此服务,仅当用户的位置发生重大变化时才会生成位置更新; 因此,它非常适合社交应用程序或为用户提供非关键的位置相关信息的应用程序。 如果应用程序在发生更新时被挂起,系统会在后台将其唤醒以处理更新。 如果应用程序启动此服务然后终止,则系统会在新位置可用时自动重新启动应用程序。 此服务在 iOS 4 及更高版本中可用,仅在包含蜂窝无线电的设备上可用。

请参阅此处和此处的 Apple 文档

以下是一些用于注册表示位置更新的示例代码:

- (void)startSignificantChangeUpdates {

// Create the location manager if it doesn't exist
if (nil == locationManager)
    locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];

}

文档说:如果您让此服务运行并且您的应用程序随后被暂停或终止,则该服务会在新的位置数据到达时自动唤醒您的应用程序。 在唤醒时,您的应用程序将进入后台并给予少量时间来处理位置数据。 因为您的应用程序在后台,所以它应该做最少的工作并避免任何可能阻止它在分配的时间到期之前返回的任务(例如查询网络)。 如果没有,您的申请可能会被终止。

好吧,这是不可能的,因为应用程序 scope 仅限于自己的空间,并且无法使用 Apple 记录的 API 列表生成此类通知。 当然.. 如果使用任何未记录的 API,应用程序将因使用未记录/私有的 API 而被苹果拒绝。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM