应用程序在后台或暂停时的位置更新
Posted
技术标签:
【中文标题】应用程序在后台或暂停时的位置更新【英文标题】:Location updates while app is in the background or suspended 【发布时间】:2011-08-14 01:48:59 【问题描述】:大家好。
我正在尝试在我的应用中实现重大的位置更改和区域支持。当应用程序处于活动状态时,接收位置更新显然没有问题。我的问题是当应用不活跃时如何处理更新。
这是我对如果检测到重大位置更改或区域进入/退出会发生什么的理解:
如果应用处于后台或暂停状态,ios 会在我现有的位置委托上调用 locationManager:didUpdateToLocation:fromLocation:(或 locationManager:didEnterRegion:)。 如果应用程序终止,iOS 调用 application:didFinishLaunchingWithOptions: 并在我的应用程序委托上使用 UIApplicationLaunchOptionsLocationKey 键。此时我需要创建一个新的位置管理器实例来获取新的位置。这是正确的吗?我错过了什么吗?
感谢您的帮助。
问候, ——约翰
【问题讨论】:
【参考方案1】:你说对了一部分。
如果应用在后台,并且您正在使用重大的位置更改:
-
应用会调用 locationManager:locationDidUpdateToLocation:fromLocation
如果应用程序在后台崩溃,它将调用 application:didFinishLaunchingWithOption: 与 UIApplicationLaunchOptionLocationKey。然后,您必须再次初始化位置管理器才能获得显着的位置更改。然后这将进入 locationManager:locationDidUpdateToLocation:fromLocation。这一步很重要
如果应用在后台,并且您正在使用区域监控
-
locationManager:locationDidUpdateToLocation:fromLocation 不会被调用
应用调用 locationManager:didEnterRegion:
【讨论】:
对。我遗漏了 locationManager:didEnterRegion。我想我放弃了区域监控,似乎不起作用。尝试了具有各种阈值的所有大小区域,似乎无法正常工作。 @honcheng 嗨,如果应用在后台 locationManager:didEnterRegion 会被调用吗?真的吗?我已经阅读了大量的帖子,他们都声称一旦应用程序处于后台,即使设置了区域监控,也只会调用 locationManager:locationDidUpdate:fromLocation。只是希望澄清一下,因为我想在后台设置区域监控。 以下是关于如何在 iOS 7 和 8 的应用被终止/挂起时获取位置更新的解决方案:***.com/questions/27742677/…【参考方案2】:在应用程序处于后台时与应用程序暂停时获取位置更新是两种截然不同的情况。您将不得不以不同的方式处理它们。
如果你的locationManager
使用的是startMonitoringSignificantLocationChanges
方法,你只能使用密钥UIApplicationLaunchOptionsLocationKey
,你不能使用startUpdatingLocation
。
获取位置更新时
A) 应用在后台,请看:Background Location Services not working in iOS 7
B) 应用程序被暂停/终止,请参阅:How to Get Location Updates for iOS 7 and 8 Even when the App is Suspended
我写了 2 篇很长的文章来解释这 2 个场景之间的区别。上述 2 个场景的源代码也可以在 GitHub 上找到。
【讨论】:
【参考方案3】:如果您的应用不在前台,我相信它总是调用 application: didFinishLaunchingWithOptions。
【讨论】:
它只会在后台调用这个,如果应用程序没有启动,或者已经崩溃。设备尝试重启应用,所以它只调用此方法以上是关于应用程序在后台或暂停时的位置更新的主要内容,如果未能解决你的问题,请参考以下文章
即使应用程序在后台运行,如何使用 swift 在 ios 中获取位置更新