Swift 在位置服务中杀死应用获取数据?
Swift killed app fetch data in location service?
我想在应用终止时获取数据。但是我想如果应用程序被杀死我就无法获取数据。
位置更新服务是 运行 当应用被终止时。我可以在位置服务中获取我的数据并更新本地数据库吗?
或者有什么方法可以在应用程序被杀死时获取数据?只是我想请求一些 api,从中获取数据并插入本地数据库。
很遗憾,但是没有。由于您的应用已关闭,您无法获取任何数据或执行任何其他操作。当应用程序打开时,您可以做所有事情并进行一些数学运算。
是的,你可以。您设置了background task
但时间有限
这取决于设备电池
一定要在Capabilities
中打开Location Updates
您可以检查 this 后台任务
示例代码:
final class LocationManager: NSObject {
static let shared = LocationManager()
private var backgroundTask = UIBackgroundTaskIdentifier.invalid
private let manager = CLLocationManager()
func startMonitoring() {
manager.delegate = self
manager.allowsBackgroundLocationUpdates = true
manager.pausesLocationUpdatesAutomatically = false
manager.startMonitoringSignificantLocationChanges()
manager.requestAlwaysAuthorization()
}
}
extension LocationManager: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
print("LocationManager didStartMonitoringFor")
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("LocationManager \(error)")
}
func locationManager(_ manager: CLLocationManager, monitoringDidFailFor region: CLRegion?, withError error: Error) {
print("LocationManager \(error)")
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
postLocation(location: locations.first)
}
}
extension LocationManager {
private func postLocation(location: CLLocation?) {
guard let location = location else { return }
if UIApplication.shared.applicationState == .background {
backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "locationTaskName", expirationHandler: {
UIApplication.shared.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskIdentifier.invalid
})
DispatchQueue.global(qos: .background).async {
self.postRequest(location: location) { [weak self] in
guard let self = self else { return }
UIApplication.shared.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskIdentifier.invalid
}
}
} else {
postRequest(location: location)
}
}
private func postRequest(location: CLLocation, completion: (() -> Void)? = nil) {
// TODO Request
//service.sendLocation
}
我想在应用终止时获取数据。但是我想如果应用程序被杀死我就无法获取数据。
位置更新服务是 运行 当应用被终止时。我可以在位置服务中获取我的数据并更新本地数据库吗?
或者有什么方法可以在应用程序被杀死时获取数据?只是我想请求一些 api,从中获取数据并插入本地数据库。
很遗憾,但是没有。由于您的应用已关闭,您无法获取任何数据或执行任何其他操作。当应用程序打开时,您可以做所有事情并进行一些数学运算。
是的,你可以。您设置了background task
但时间有限
这取决于设备电池
一定要在Capabilities
Location Updates
您可以检查 this 后台任务
示例代码:
final class LocationManager: NSObject {
static let shared = LocationManager()
private var backgroundTask = UIBackgroundTaskIdentifier.invalid
private let manager = CLLocationManager()
func startMonitoring() {
manager.delegate = self
manager.allowsBackgroundLocationUpdates = true
manager.pausesLocationUpdatesAutomatically = false
manager.startMonitoringSignificantLocationChanges()
manager.requestAlwaysAuthorization()
}
}
extension LocationManager: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
print("LocationManager didStartMonitoringFor")
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("LocationManager \(error)")
}
func locationManager(_ manager: CLLocationManager, monitoringDidFailFor region: CLRegion?, withError error: Error) {
print("LocationManager \(error)")
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
postLocation(location: locations.first)
}
}
extension LocationManager {
private func postLocation(location: CLLocation?) {
guard let location = location else { return }
if UIApplication.shared.applicationState == .background {
backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "locationTaskName", expirationHandler: {
UIApplication.shared.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskIdentifier.invalid
})
DispatchQueue.global(qos: .background).async {
self.postRequest(location: location) { [weak self] in
guard let self = self else { return }
UIApplication.shared.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskIdentifier.invalid
}
}
} else {
postRequest(location: location)
}
}
private func postRequest(location: CLLocation, completion: (() -> Void)? = nil) {
// TODO Request
//service.sendLocation
}