Реагируйте на собственные модули - Экспорт Swift - HealthKit - PullRequest
0 голосов
/ 24 октября 2018

У меня есть приложение 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()
}

Любая помощь будет принята с благодарностью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...