У меня есть приложение React Native (0.57), и я пытаюсь получить доступ к HealthKit и создать запрос для получения ежедневного количества шагов.
К счастью, у меня работает функция авторизации, но я не могу получить счетчик шагов.
NativeModules.Steps.checkAuthorization()
-> работает!
Я попробовал 2 разные функции Я пытаюсь в моем файле steps.swift
, но обе программы, похоже, вылетали из моего приложения.Я не знаю, неверен ли код swift или мое определение в мостике неверно.Любая помощь будет принята с благодарностью!
Функция getTodaysSteps
@objc(getTodaysSteps:)
func getTodaysSteps(completion: @escaping (Double) -> Void) {
let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let now = Date()
let startOfDay = Calendar.current.startOfDay(for: now)
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, _ in
guard let result = result, let sum = result.sumQuantity() else {
completion(0.0)
return
}
completion(sum.doubleValue(for: HKUnit.count()))
}
storage.execute(query)
}
Функция недавних шагов
@objc(recentSteps:failure:)
func recentSteps(success: @escaping (Double) -> (), failure: @escaping (Error?) -> () ) {
guard let type = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount) else {
failure(nil)
return
}
let predicate = HKQuery.predicateForSamples(withStart: Date(), end: Date(), options: [])
let query = HKSampleQuery(sampleType: type, predicate: predicate, limit: 0, sortDescriptors: nil) { query, results, error in
if let error = error {
failure(error)
}
var steps: Double = 0
results?.forEach { result in
if let quantity = result as? HKQuantitySample { // ??? not sure if result (type HKSample) will convert to type HKQuantitySample
steps += quantity.quantity.doubleValue(for: HKUnit.count())
}
}
success(steps)
}
storage.execute(query)
}
}
К сожалению, ни один из этих способов не работает.Приложение вылетает, когда я вызываю эти функции.
Файл моста
Вот как я определяю их в файле моста.Я ожидаю, что я делаю это неправильно.
#import <React/RCTBridgeModule.h>
@interface RCT_EXTERN_MODULE(Steps, NSObject)
RCT_EXTERN_METHOD(checkAuthorization)
RCT_EXTERN_METHOD(getTodaysSteps:)
RCT_EXTERN_METHOD(recentSteps:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
@end
JavaScript Land
Я вызываю такие функции в моем приложении React Native:
componentWillMount () {
console.log(NativeModules, 'NativeModules in mounting')
NativeModules.Steps.checkAuthorization()
NativeModules.Steps.getTodaysSteps()
NativeModules.Steps.recentSteps()
}
Любая помощь будет принята с благодарностью!