私は、バックグラウンドでユーザーの場所を取得するために重要な場所の変更を監視するアプリケーションを開発しています。私はlocationManager.startMonitoringSignificantLocationChanges
とlocationManager:didUpdateLocations
とlocationManager:didFailWithError
の方法を私のCLLocationManagerDelegate
に実装しました。重要なロケーションの変更を監視するときに、ロケーション更新を延期することはできますか?
しかし、SLCは実際に必要以上に正確です。 Appleの文書によると、私のテストで確かめられたところによると、slcはおよそ500mごとに5〜10分の間に場所の更新を引き起こします。したがって、このガイドで説明されているdidUpdateLocations
メソッドのlocationManager.allowDeferredLocationUpdatesUntilTravelled:timeout
をデリゲートのhttp://apple.co/1W4gqEJに実装しました。
var deferringUpdates = false
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
for location in locations {
NSLog("Significant location change recorded:\n%@", location)
}
if let location = locations.first {
let secondsAgo: NSTimeInterval = location.timestamp.timeIntervalSinceNow
// Only process the location if it is very recent (less than 15 seconds old).
if abs(secondsAgo) < 15.0 {
saveExtendedUserInfo(withLocation: location)
}
}
if !deferringUpdates {
manager.allowDeferredLocationUpdatesUntilTraveled(810, timeout: 600)
deferringUpdates = true
NSLog("Deferring location updates...")
}
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
NSLog(error.localizedDescription)
}
func locationManager(manager: CLLocationManager,
didFinishDeferredUpdatesWithError error: NSError?)
{
deferringUpdates = false
if let deferralError = error {
NSLog(deferralError.localizedDescription)
}
}
残念ながら、ロケーションマネージャが更新を延期することはありません:
は、ここに私のコードです。 allowDeferredUpdatesUntilTravelled:timeout
が呼び出された直後に、デリゲートはdidFinishDeferredUpdatesWithError
を実行し、kCLErrorDomain 12
(CLError.DeferredNotUpdatingLocation
)を生成します。
なぜエラーが表示されますか?これは、遅延アップデートサービスが、重要なロケーションの変化を「ロケーションの更新」として認識しないことを意味しているようです。 slcイベントの配信を延期することも、何らかの形でその頻度を減らすことも可能ですか?もしそうなら、どうですか?
ねえ。私は同じことを実装しています。どうやったの?これで私を助けてくれますか?どのようにこのメソッドを使用するか.allowDeferredUpdatesUntilTravelled:ユーザーの速度に応じてタイムアウトしますか? – BHUMICA