HealthStore enableBackgroundDelivery when screen is locked

前端 未结 4 768
栀梦
栀梦 2020-12-29 15:36

Hello I\'m trying to setup the health store observer with background delivery enabled. My problem is that it won\'t deliver anything when the screen is locked. I have simpli

相关标签:
4条回答
  • 2020-12-29 16:04

    When iPhone is locked, you cannot access healthKit data with any way.

    When iPhone is unlocked but the app is in background, you can only use HKObserverQuery, which is used to know whether some new samples are added or not.

    When iPhone is unlocked and the app is in foreground, you can use everything related to HealthKit Framework.

    0 讨论(0)
  • 2020-12-29 16:07

    In case of HKObserverQuery, you have to enable any of the background modes of the application to get notified for the ObserverQuery in background(application not killed).

    enter image description here

    0 讨论(0)
  • 2020-12-29 16:14

    Steps have a minimum update frequency of 1 hour, meaning your app will only get woken up once/hour. Once you open the app, your observer queries get fired off right away. See the note in the discussion for enableBackgroundDeliveryForType.

    https://developer.apple.com/library/prerelease/ios/documentation/HealthKit/Reference/HKHealthStore_Class/index.html#//apple_ref/occ/instm/HKHealthStore/enableBackgroundDeliveryForType:frequency:withCompletion:

    0 讨论(0)
  • 2020-12-29 16:26

    I was able to get this to work observing weight and blood glucose changes to HealthKit.

    In ApplicationDelegate:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.        
    
        GlobalHealthManager.startObservingWeightChanges()
    
        return true
    }
    

    HealthManager.swift

        let past = NSDate.distantPast() as NSDate
        let now   = NSDate()
        return HKQuery.predicateForSamplesWithStartDate(past, endDate:now, options: .None)
    
        }()
    
        //here is my query:
        lazy var query: HKObserverQuery = {[weak self] in
        let strongSelf = self!
        return HKObserverQuery(sampleType: strongSelf.weightQuantityType,
            //predicate: strongSelf.longRunningPredicate,
            predicate : nil, //all samples delivered
            updateHandler: strongSelf.weightChangedHandler)
        }()
    
    
    
    
    func startObservingWeightChanges(){
            healthKitStore?.executeQuery(query)
            healthKitStore?.enableBackgroundDeliveryForType(weightQuantityType,
                frequency: .Immediate,
                withCompletion: {(succeeded: Bool, error: NSError!) in
    
                if succeeded{
                    println("Enabled background delivery of weight changes")
                } else {
                    if let theError = error{
                        print("Failed to enable background delivery of weight changes. ")
                        println("Error = \(theError)")
                    }
                }
    
        })
    }
    
    
    
    /** this should get called in the background */
    func weightChangedHandler(query: HKObserverQuery!,
        completionHandler: HKObserverQueryCompletionHandler!,
        error: NSError!){
    
            NSLog(" Got an update Here ")
    
         /** this function will get called each time a new weight sample is added to healthKit.  
    
        //Here, I need to actually query for the changed values.. 
       //using the standard query functions in HealthKit.. 
    
             //Tell IOS we're done... updated my server, etc. 
             completionHandler()         
    }
    
    
    }
    
    0 讨论(0)
提交回复
热议问题