life360 等应用程序如何在终止状态下获取位置更新?

Posted

技术标签:

【中文标题】life360 等应用程序如何在终止状态下获取位置更新?【英文标题】:How do apps like life360 get location updates in terminated state? 【发布时间】:2020-08-14 19:59:21 【问题描述】:

即使应用程序被用户终止,我也需要接收位置更新。 life360 等应用在所有应用状态下都会收到准确的位置更新:已终止、后台和前台。以下两份来自 Apple 的文档强调了在应用程序终止后可以获得位置更新:

https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/handling_location_events_in_the_background

https://developer.apple.com/documentation/corelocation/cllocationmanager/1423531-startmonitoringsignificantlocati

奇怪的是,我直接联系了苹果,因为我无法在终止状态下获取位置更新。这是确切的响应:

应用程序不会在 如果应用程序之前有过重大位置更改的背景 被用户强制退出。强制退出是一个激进的选择 用户说他们不希望应用程序运行,通常是因为它 以某种不可恢复的方式行为不端。

在强制退出后重新启动应用的唯一位置 API 是 区域监控。

这就引出了一个问题,谁是对的?文档是否不正确或过时?尽管处于终止状态,life360 如何持续跟踪我家人的位置?苹果对 life360 有特殊待遇吗?

【问题讨论】:

我确实有同样的问题 我的应用会在位置更改后 10 分钟内更新,但此应用会立即更新... 【参考方案1】:

我开发了一个类似于 life 360​​ 的应用程序,它在应用程序终止或处于后台时使用位置跟踪。 这是一个相对简单的壮举。您必须设置您的位置管理器实例,以便在您的应用程序被终止或推送到后台后立即跟踪重大的位置更改。这将减少电池消耗和准确性,但有助于阻止电池耗尽,否则即使检测到重大位置变化,ios 也可能无法启动您的应用程序。 这是我如何实现这一目标的示例代码

func applicationWillEnterForeground(_ application: UIApplication) 
    LocationHelper.handleEnterForeground()


func applicationDidEnterBackground(_ application: UIApplication) 
    LocationHelper.handleEnterBackground()


func applicationWillTerminate(_ application: UIApplication) 
    LocationHelper.handleAppKilled()

在 LocationManager.swift 中:

var locationManager = CLLocationManager()

override init() 
    super.init()
    locationManager.delegate = self
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.pausesLocationUpdatesAutomatically = true
    locationManager.activityType = .automotiveNavigation
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = 25
    
    if hasLocationPermission() 
        self.locationManager.startUpdatingLocation()
     else 
        self.asklocationPermission()
    


static func handleEnterForeground() 
    LocationHelper.shared = LocationHelper()
    LocationHelper.shared.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    LocationHelper.shared.locationManager.startUpdatingLocation()


static func handleEnterBackground() 
    LocationHelper.shared = LocationHelper()
    LocationHelper.shared.locationManager.stopUpdatingLocation()
    LocationHelper.shared.locationManager.startMonitoringSignificantLocationChanges()


static func handleAppKilled() 
    LocationHelper.shared = LocationHelper()
    LocationHelper.shared.locationManager.stopUpdatingLocation()
    LocationHelper.shared.locationManager.startMonitoringSignificantLocationChanges()

【讨论】:

以上是关于life360 等应用程序如何在终止状态下获取位置更新?的主要内容,如果未能解决你的问题,请参考以下文章

即使应用程序处于终止状态或被杀死,如何在 iOS 中获取位置更新? [复制]

电脑错误提示:此应用程序运行时要求终止它在一个不寻常wpiease联系以获取更多信息,应用程序的支持团队。

如何在不编码窗口状态的情况下以编程方式终止 NSApp?

当应用程序处于后台或终止状态时,如何找到用户位置?

在后台模式和终止模式下获取位置更新 IOS

即使应用程序终止,iOS 9 如何获取位置