HealthKit背景交付根本不起作用
我在下面检查了链接 当应用程序不运行
并按照所有指令在后台模式下从步行计数中获取更新,如果它检测到步骤,请将信息发送到我的个人服务器。 但是即使我走了很多小时,它也永远不会发送到我的服务器。
我的iOS版本是15.5,观看OS版本是8.6,这是
Swiftui上的最新版本,我们没有A- delegate,所以我在Main View中写下了EnebableDelivery和HkobServerQuery函数
。
import SwiftUI
import HealthKit
import os
import CoreData
// The Coffee Tracker app's main view.
struct CoffeeTrackerView: View {
@EnvironmentObject var coffeeData: CoffeeData
@State var showDrinkList = false
private var backgroundObserver: HKObserverQuery? = nil
private let store = HKHealthStore()
// Properties that determine whether the store is available and ready to use.
private let isAvailable = HKHealthStore.isHealthDataAvailable()
private var isAuthorized = false
// Lay out the view's body.
var body: some View {
// Use a timeline view to update the caffeine dose every minute.
// This works both when the user's interacting with the app,
// and when it's in Always On mode.
TimelineView(.everyMinute) { context in
VStack {
// Display the current amount of caffeine in the user's body.
Text(coffeeData.mgCaffeineString(atDate: context.date) + " mg")
.font(.body)
.fontWeight(.bold)
.foregroundColor(colorForCaffeineDose(atDate: context.date))
Text("Current Caffeine Dose")
.font(.footnote)
Divider()
// Display how much the user has drunk today,
// using the equivalent number of 8 oz. cups of coffee.
Text(coffeeData.totalCupsTodayString + " cups")
.font(.body)
.fontWeight(.bold)
.foregroundColor(colorForDailyDrinkCount())
Text("Equivalent Drinks Today")
.font(.footnote)
Spacer()
// Display a button that lets the user record new drinks.
Button(action: { self.showDrinkList.toggle() }) {
Image("add-coffee")
.renderingMode(.template)
}
}.onAppear{
let steps: HKObjectType = HKObjectType.quantityType(forIdentifier: .stepCount)!
if store.authorizationStatus(for: steps) != HKAuthorizationStatus.notDetermined {
store.enableBackgroundDelivery(for: steps, frequency: .immediate, withCompletion: { (worked, error) in
//registers for background data
let myUrl = URL(string:"https://my_server/testpage?q=processUpdate22")
var request = URLRequest(url: myUrl!)
request.httpMethod="GET"
let task = URLSession.shared.dataTask(with: request){
(data:Data?,response:URLResponse?,error:Error?) in
if error != nil {
print("error \(error)")
return
}else{
print("no error")
}
}
task.resume()
if error != nil {
print(error)
}
})
let sampleType = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
let query = HKObserverQuery(sampleType: sampleType, predicate: nil) {
query, completionHandler, error in
let myUrl = URL(string:"https://my_server/testpage?q=processUpdatee")
var request = URLRequest(url: myUrl!)
request.httpMethod="GET"
let task = URLSession.shared.dataTask(with: request){
(data:Data?,response:URLResponse?,error:Error?) in
if error != nil {
print("error \(error)")
return
}
}
task.resume()
if error != nil {
print(error)
abort()
}
// Take whatever steps are necessary to update your app's data and UI
// This may involve executing other queries
// self.getSteps(completion: { (stepCount) in
// print("Step count was updated to \(stepCount)")
// })
completionHandler()
}
store.execute(query)
}
}
}
.sheet(isPresented: $showDrinkList) {
DrinkListView().environmentObject(self.coffeeData)
}
}
I checked below link
Healthkit background delivery when app is not running
and follow all instruction to get update from my walk count in background mode and if it detect step, send information to my personal server.
but it never send to my server even if I walk many hours .
my iOS version is 15.5 and watch os version is 8.6 which is newest version for all
on swiftUI we don't have a--delegate so, I wrote enableDelivery and HKObserverQuery function in main view
I wrote code based on apple's sample code for coffee tracker
import SwiftUI
import HealthKit
import os
import CoreData
// The Coffee Tracker app's main view.
struct CoffeeTrackerView: View {
@EnvironmentObject var coffeeData: CoffeeData
@State var showDrinkList = false
private var backgroundObserver: HKObserverQuery? = nil
private let store = HKHealthStore()
// Properties that determine whether the store is available and ready to use.
private let isAvailable = HKHealthStore.isHealthDataAvailable()
private var isAuthorized = false
// Lay out the view's body.
var body: some View {
// Use a timeline view to update the caffeine dose every minute.
// This works both when the user's interacting with the app,
// and when it's in Always On mode.
TimelineView(.everyMinute) { context in
VStack {
// Display the current amount of caffeine in the user's body.
Text(coffeeData.mgCaffeineString(atDate: context.date) + " mg")
.font(.body)
.fontWeight(.bold)
.foregroundColor(colorForCaffeineDose(atDate: context.date))
Text("Current Caffeine Dose")
.font(.footnote)
Divider()
// Display how much the user has drunk today,
// using the equivalent number of 8 oz. cups of coffee.
Text(coffeeData.totalCupsTodayString + " cups")
.font(.body)
.fontWeight(.bold)
.foregroundColor(colorForDailyDrinkCount())
Text("Equivalent Drinks Today")
.font(.footnote)
Spacer()
// Display a button that lets the user record new drinks.
Button(action: { self.showDrinkList.toggle() }) {
Image("add-coffee")
.renderingMode(.template)
}
}.onAppear{
let steps: HKObjectType = HKObjectType.quantityType(forIdentifier: .stepCount)!
if store.authorizationStatus(for: steps) != HKAuthorizationStatus.notDetermined {
store.enableBackgroundDelivery(for: steps, frequency: .immediate, withCompletion: { (worked, error) in
//registers for background data
let myUrl = URL(string:"https://my_server/testpage?q=processUpdate22")
var request = URLRequest(url: myUrl!)
request.httpMethod="GET"
let task = URLSession.shared.dataTask(with: request){
(data:Data?,response:URLResponse?,error:Error?) in
if error != nil {
print("error \(error)")
return
}else{
print("no error")
}
}
task.resume()
if error != nil {
print(error)
}
})
let sampleType = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
let query = HKObserverQuery(sampleType: sampleType, predicate: nil) {
query, completionHandler, error in
let myUrl = URL(string:"https://my_server/testpage?q=processUpdatee")
var request = URLRequest(url: myUrl!)
request.httpMethod="GET"
let task = URLSession.shared.dataTask(with: request){
(data:Data?,response:URLResponse?,error:Error?) in
if error != nil {
print("error \(error)")
return
}
}
task.resume()
if error != nil {
print(error)
abort()
}
// Take whatever steps are necessary to update your app's data and UI
// This may involve executing other queries
// self.getSteps(completion: { (stepCount) in
// print("Step count was updated to \(stepCount)")
// })
completionHandler()
}
store.execute(query)
}
}
}
.sheet(isPresented: $showDrinkList) {
DrinkListView().environmentObject(self.coffeeData)
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论