2016-06-23 6 views
0

新しいデータ入力が観察されるたびに、私のアプリケーションでHealthKitデータとデータベースを同期させようとしています。 Despite some ambiguity in the logic私は、サンプルタイプのバックグラウンド配信を可能にし、必要に応じてオブザーバーに反応させることができたと信じています。HKAnchoredObjectQueryがバックグラウンドで確実に返さない

しかし、オブザーバーのアップデートハンドラーでは、HealthKitから最新の結果を取得するためにHKAnchoredObjectQueryを作成する必要がありますが、これらのクエリは、アプリがバックグラウンドで実行されているときに確実に返されません。 HealthKitでサンプルポイントを追加すると、アンカーされたクエリが実行されるだけですが、アプリケーションをフォアグラウンドに戻したときにのみ返されます。

私はアプリを有効にすることなくすぐに返されます。考えられる問題の1つは、すべてのオブザーバークエリが更新ハンドラを起動するため、複数のAnchoredObjectQueriesが作成されたり返されないことがあります。私はそれが無関係かもしれないので、リンクされたスレッドでさらにそれを説明しました。

func synchronizeRecentData(sampleType: HKSampleType, observerQuery: HKObserverQuery) { 

    let completionHandler: (HKAnchoredObjectQuery, [HKSample]?, Int, NSError?) -> Void = { 
     [unowned self] query, results, newAnchor, error in 

     if error != nil { 
      abort() 
     } 

     // Update queryAnchor 
     self.queryAnchors[sampleType] = newAnchor 

     guard let receivedNewSamples = results as? [HKQuantitySample] else { 
      abort() 
     } 

     // Handle received samples here 
    } 

    let query = HKAnchoredObjectQuery(type: sampleType, 
             predicate: nil, 
             anchor: self.queryAnchors[sampleType]!, 
             limit: HKObjectQueryNoLimit, 
             completionHandler: completionHandler) 
    healthKitStore.executeQuery(query) 
} 
+0

です。 –

答えて

0

私はこのアプリがバックグラウンドで目が覚めますときにアプリが取得する前に実行するための非常に限られた時間を持っているためであると考えている。ここで

は私がHKObserverQueryのupdatehandlerから呼んでいる機能の一例です再び中断される。 UIBackgroundTaskIdentifierを使用する場合は、HKAnchoredObjectQueryの結果を取得するのに十分な時間アプリを実行できるようにする必要があります。

1

はHealthKitのドキュメントによれば、観察者のクエリとは異なり

、これらの更新は が追加または削除されたアイテムのリストを含みます。ただし、アンカーされたオブジェクトクエリは、 にバックグラウンド配信用に登録することはできません。詳細については、 HKAnchoredObjectQueryを参照してください。

背景配信に登録することができる唯一のクエリは、あなたのアプリが中断されたくない場合は、あなたがHKWorkoutSessionを開始する必要がありHKObserverQuery

関連する問題