簡體   English   中英

在后台跟蹤時間以處理位置更新

[英]Keeping track of time in background to handle location updates

我的應用程序有兩個約束,一個是用戶位置,另一個是時間。 以下是簡單的位置實現。

func determineMyCurrentLocation() {
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
    locationManager.requestAlwaysAuthorization()
    locationManager.distanceFilter = 20

    if CLLocationManager.locationServicesEnabled() {
        locationManager.startUpdatingLocation()
    }
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("*******Location updated*******")
}

使用此代碼,我希望每次用戶位置變化20m時(在后台)也會被觸發。 但是,我還需要跟蹤用戶停留在特定位置的時間。 由於我需要跟蹤背景情況,因此無法使用計時器。

我按照https://www.raywenderlich.com/143128/background-modes-tutorial-getting-started嘗試進行后台任務,但是如文章所述,后台時間允許我大約3分鍾(這是可變的) 。 所以我相信我不能這樣做。

我該如何解決?

編輯:如果用戶在某個位置停留X分鍾,我還需要進行api調用。 因此,在這種情況下,等待位置更新並計算時間差是不可行的。 我以前可以通過刪除距離過濾器並連續檢查位置並比較時間和位置來解決此問題。 我猜想連續的位置跟蹤將使應用程序被拒絕,這就是為什么我選擇過濾器。 但是我不確定它是否仍然會被拒絕,因為iOS也需要跟蹤過濾器的位置。

您可以使用簡單的Date對象來跟蹤兩次位置更新之間花費的時間,即使您的應用程序處於后台。 只需為您的類聲明一個Date屬性,從func locationManager(_:, didUpdateLocations:)更新其值,然后將其與當前時間進行比較即可。

// Declare this in a scope that can be accessed from `didUpdateLocations` and where its value won't be released from memory
var lastUpdateTimestamp = Date()

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let now = Date()
    let timeSinceLastUpdate = now.timeIntervalSince(lastUpdateTimestamp)
    print("\(timeSinceLastUpdate) seconds passed since last location update")
    lastUpdateTimestamp = now
}

對問題編輯的回答:在后台經過X分鍾后無法進行API調用而沒有位置更新是不可能的,因為不支持在特定時間執行任意功能的后台模式。 如您在編輯中所述,擺脫距離過濾器可能是一個有效的選擇,但是,如果您的應用僅使用位置更新來進行API調用,而實際上並沒有對這些位置執行任何操作,則您的應用可能確實被拒絕。

當您收到新的位置更新時,請檢查與前一個更新的時差..為您提供它們在最后一個位置的時間。

根據您對這些位置更新的處理方式,可能只是從某些數據庫中獲取最新更新,或者發布到API。

一個例子..

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("*******Location updated*******")
    let lastUpdateDate = // get the last datetime you received information

    let currentDate = Date()
    let minutesDifference = let componentsLeftTime = Calendar.current.dateComponents([.minute], from: lastUpdateDate, to: currentDate)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM