HealthKit背景交付根本不起作用

发布于 2025-02-07 01:36:59 字数 5612 浏览 1 评论 0原文

我在下面检查了链接 当应用程序不运行

并按照所有指令在后台模式下从步行计数中获取更新,如果它检测到步骤,请将信息发送到我的个人服务器。 但是即使我走了很多小时,它也永远不会发送到我的服务器。

我的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文