【发布时间】:2014-04-28 22:38:25
【问题描述】:
我正在编写一个用于iOS后台跟踪的Cordova插件,我的理解如下:
- 我使用
startUpdatingLocation开始跟踪 - 无论我的应用是在前台还是在后台,这都会发送位置
- 如果我在后台接收到一个位置并花费太多时间来处理它,iOS 将终止该应用程序
- 这也是我使用
startMonitoringSignificantLocationChanges的原因,所以如果我的应用程序被杀死,iOS 将在didFinishLaunchingWithOptions的新位置重新打开它
对吗?
我还有两个问题:
监控重大位置变化
如果我的应用程序被杀死,我会致电startMonitoringSignificantLocationChanges 重新启动它。我已经读到在这种情况下,最新的位置在传递给方法的选项中给出,但是我们必须再次调用 startUpdatingLocation 和 startMonitoringSignificantLocationChanges 来保持地理位置的到来,这是正确的吗?
另外,如果我们必须调用startUpdatingLocation,并且(我假设)这会生成一个对具有最新位置的位置处理程序的新调用,那么直接在didFinishLaunchingWithOptions 中使用作为参数给出的位置是否有意义方法而不是位置处理程序?
这似乎会导致代码的两个部分具有相同的处理任务,因此这是多余的(我假设位置处理也在位置处理程序中完成,因为这是应用程序在被杀死之前的目的——我看到的唯一可能需要在didFinishLaunchingWithOptions 中处理而不重新启动startUpdatingLocation 的情况是地理围栏应用程序,它只需要在特定位置附近唤醒而不必跟踪用户,这就是为什么给出该选项的原因?)
现在的问题是:在编写 Cordova 插件时,有没有办法直接向 didFinishLaunchingWithOptions 方法添加处理程序,以便再次回调 startUpdatingLocation 和 startMonitoringSignificantChanges?或者是从插件代码中监听相应通知的唯一方法?
处理地理位置时的 JavaScript 事件
插件在前台或后台收到位置时调用 javascript 事件。但是,此 javascript 代码可能会运行一些任务,例如带有计时器的动画等。我想更好地了解 Cordova 执行,看看这是否会导致延迟,从而导致应用程序在例如接收地理位置时被杀死启动一个运行动画时间过长的 javascript 计时器,这会保持应用程序运行并触发 iOS 看门狗,还是在 BackgroundTask 线程中运行?
例如,如果我运行一个对新位置做出反应的 AngularJS 应用程序,由于 AngularJS 有它自己的运行循环,会发生什么情况,应用程序是否总是会被终止,因为 AngularJS 一直在观察变量的变化等等&我必须告诉AngularJS 在应用程序处于后台时停止其运行循环?
特别是,如果我想向服务器异步发送 HTTP 请求会发生什么? Cordova 会在后台运行 js,还是我必须告诉 Cordova 等到某个事件发生,例如 js 代码执行请求并告诉 Cordova 它已经完成,以便 Cordova 可以完成后台任务?
【问题讨论】:
-
"如果我在后台收到一个位置并且花费太多时间来处理它,iOS 将终止该应用程序"。你从哪里弄来的?
-
如果应用程序在后台进行 10m 的处理,它是否会被自动杀死? developer.apple.com/library/ios/documentation/iphone/conceptual/…
-
也许您正在考虑 beginBackgroundTaskWithExpirationHandler: 它允许应用程序在后台执行 10 分钟(实际上现在它在 iOS 7 中约为 3 分钟)。但这适用于没有后台模式但您的应用程序具有位置后台模式的应用程序。然后它不会“杀死”应用程序。 10 分钟后杀死和停止执行肯定不是一回事。所以回答你的问题,不,它不正确。
-
所以如果我理解正确,当我添加
location后台模式时,iOS看门狗不适用,iOS既不会挂起也不会杀死应用程序(除非内存已满,在这种情况下如果我想重新打开我的应用程序,我想我仍然必须使用monitorSignificantLocationChanges?)
标签: ios cordova background geolocation