Xcode / iOS模拟器:手动触发重大位置更改

问题描述

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

解决方法

        有两个答案: A)跳上火车:-) B)使用模拟器。在iOS 5.x模拟器中,没有带有位置子菜单的调试菜单。选择高速公路。这将使模拟器沿着想象中的北加州风景秀丽的280开始。它为您提供除视图之外的所有内容:您的应用将获得“重要的位置更改”更新,如果已暂停,它还将在后台启动。 要验证您是否确实在移动,请在模拟器中启动safari,然后转到maps.google.com,然后点击跟踪我的位置按钮。你应该搬家。 太棒了!现在如何调试系统启动的生命周期问题?简单!让xCode等待您的应用程序启动以开始调试。从方案菜单中,选择编辑方案。在“运行方案”和“信息”选项卡中,为“启动”设置选择:\“等待My.app启动\”。 在模拟器中运行一次您的应用程序,以便它开始监视位置更新,然后强制退出它,以便将其挂起。在您的应用程序中添加一个断点确实完成了启动功能,然后等待。一旦您的模拟器足够远,您的应用程序将被唤醒,断点被击中,您就可以赚钱。 但实际上,乘火车更有趣。     ,        好吧,我发现我可以通过切换飞行模式和/或WiFi来实现此目的。也许以设备在飞行模式下启动应用程序,然后关闭应用程序并关闭飞行模式。这将打开GPS并强制发送位置更新。     ,        我还想测试重新启动终止的应用程序,该应用程序使用了重要的更改监视功能。我编写了一段代码,以便在启动选项字典中的位置键启动它时显示本地通知。 我在模拟器中运行了我的应用程序。然后从多任务处理栏中将其杀死。然后,将iOS模拟器的位置设置为自定义位置。我退出模拟器,然后再次启动。我的应用收到了重要的位置更新,并显示了本地通知。     ,        我在同一个问题上苦苦挣扎,该如何测试\'startMonitoringSignificantLocationChanges \'并检查我的应用在暂停时是否正在接收位置更新。 我无法在断点上捕获执行,但是通过将新的位置数据发送到服务器,我设法看到了实现的结果。 整个流程: -通过\'startMonitoringSignificantLocationChanges \'和对我的服务器的API调用实现,以更新位置纬度和经度 -将位置更新背景模式功能设置为true -运行该应用程序,以便启动位置管理器,并且该应用程序正在侦听位置更改 -强制关闭应用程序 -将模拟器上的debug-> location设置为高速公路 -打开地图以查看位置是否在变化 -等待服务器上的位置更新,并每3分钟获取新结果 但是,我仍然不确定在实际设备上是否足够好。 我正在使用Xcode 6.0.1(6A317);在模拟器iPhone 5s(8.0)上进行了测试。     ,        根据您的方案,我建议两种解决方案: 使用一个Timer或LocalNotification,它定期调用stopMonitoringSignificantLocationChanges,然后依次调用startMonitoringSignificantLocationChanges,这将触发将新位置发送到您的代码(可能与以前的位置相同)。 建立您自己的GPS模拟器,该模拟器将在调试版本中开始,并且将调用与CLLocationManager相同的委托方法。     ,        我在iOS 7和Xcode 5.1.1中注意到的一件事-如果您期望SLC事件将您的应用启动到后台模式,则它可能会或可能不会达到您设置的断点。对我来说,有时甚至没有显示NSLog消息。 如果是这种情况,则可以从系统日志中查看NSLog输出。您可以从iOS Simulator的“调试”菜单打开“系统日志”。     ,添加到MagicSeth的答案中,如果您需要在真实设备上而不是模拟器上进行测试,则可以通过在“设置”应用程序的“常规”>“隐私”屏幕中禁用并重新启用“定位服务”,并使用“ 0”键触发后台启动。     ,        在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];
} 文档说:如果让此服务运行,并且您的应用程序随后被挂起或终止,则当新的位置数据到达时,该服务会自动唤醒您的应用程序。唤醒时,您的应用程序将被置于后台,并留出少量时间来处理位置数据。因为您的应用程序在后台,所以它应该做的工作很少,并且避免任何可能阻止其在分配的时间到期之前返回的任务(例如查询网络)。否则,您的应用程序可能会终止。     ,        高速公路驾驶
// MARK: - MKMapViewDelegate

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

    print(location.speed)
  }
    ,        嗯,这是不可能的,因为应用程序范围仅限于其自己的空间,并且此类通知无法通过Apple Documented API列表生成。 当然..如果使用了任何未公开的API,由于使用了未公开的/私有API,应用程序将被苹果拒绝。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...