Swift убил приложение, извлекающее данные в сервисе определения местоположения? - PullRequest
2 голосов
/ 11 июля 2019

Я хочу получить данные, когда приложение убито.Но я думаю, что не могу получить данные, если приложение убито.

Служба обновления местоположения работает, когда приложение убито.Могу ли я получить свои данные в службе определения местоположения и обновить локальную базу данных?

Или каким-либо способом получить данные, когда приложение убито?Просто хочу запросить немного apis, получить от них данные и вставить локальную базу данных.

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Да, вы можете. Вы установили background task, но ограниченное время.

зависит от аккумулятора устройства

Обязательно откройте Location Updates в Capabilities

Вы можете проверить это для фоновой задачи

Пример кода:

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
    }
1 голос
/ 11 июля 2019

К сожалению, но нет .Поскольку ваше приложение закрыто, вы не можете получать какие-либо данные или делать какие-либо другие вещи.Вы можете делать все, когда приложение открыто с некоторой математикой.

...