在 Swift 中使用 CLLocationManager 的正确代码设计
Proper code design to use CLLocationManager in Swift
这么基本的问题。
根据文档,我可以使用 CLLocationManager
class 上的 API startmonitoringsignificantlocationchanges
监听主要位置变化。现在根据文档,此 API 将保证我的应用程序在用户位置发生显着变化时获得回调,即使我的应用程序已暂停。到此为止一切都很好。
现在我真正想做的是,如果我至少收到一次回调,就停止监听更新。假设我调用 stopMonitoringSignificantLocationChanges
,框架如何知道我打算停止我在我的应用程序暂停并最终被垃圾收集之前设置的侦听器。
在 Android,通常每个框架服务的注册都与 App 标识符相关联。因此,无论应用程序被杀死或间歇性重启多少次,当应用程序调用取消注册时,框架基本上取消注册应用程序而不是它的实例 运行.
这让我有点困惑。
iOS也一样。 OS 使用您的应用程序的捆绑包 ID(必须是唯一的)来跟踪您的应用程序的位置更新请求。如果您调用 stopMonitoringSignificantLocationChanges
,OS 将停止这样做。受影响的是您的应用在设备上的安装,而不是您拨打电话时正在 运行ning 的应用的当前实例。 (在 iOS 上,同一个应用不能 运行 多个实例,所以这不是问题。)
这么基本的问题。
根据文档,我可以使用 CLLocationManager
class 上的 API startmonitoringsignificantlocationchanges
监听主要位置变化。现在根据文档,此 API 将保证我的应用程序在用户位置发生显着变化时获得回调,即使我的应用程序已暂停。到此为止一切都很好。
现在我真正想做的是,如果我至少收到一次回调,就停止监听更新。假设我调用 stopMonitoringSignificantLocationChanges
,框架如何知道我打算停止我在我的应用程序暂停并最终被垃圾收集之前设置的侦听器。
在 Android,通常每个框架服务的注册都与 App 标识符相关联。因此,无论应用程序被杀死或间歇性重启多少次,当应用程序调用取消注册时,框架基本上取消注册应用程序而不是它的实例 运行.
这让我有点困惑。
iOS也一样。 OS 使用您的应用程序的捆绑包 ID(必须是唯一的)来跟踪您的应用程序的位置更新请求。如果您调用 stopMonitoringSignificantLocationChanges
,OS 将停止这样做。受影响的是您的应用在设备上的安装,而不是您拨打电话时正在 运行ning 的应用的当前实例。 (在 iOS 上,同一个应用不能 运行 多个实例,所以这不是问题。)