запрос не работает — React Native app Xcode

#objective-c #swift #xcode #react-native #healthkit

#objective-c #swift #xcode #react-native #healthkit

Вопрос:

Мой запрос HealthKit не работает.
Я пытаюсь подсчитать количество шагов и не понимаю, какая часть моего кода правильная.
Когда я создаю приложение, оно выдает либо «updateStepsCount не является распознанным методом objc», либо «Необработанное отклонение обещания».
Где я ошибаюсь!!!

Контроллер.swift:

 @objc
  func updateStepsCount(_ statisticsCollection: HKStatisticsCollection, _ resolve: @escaping RCTPromiseResolveBlock,
                        rejecter reject: @escaping (RCTPromiseRejectBlock) -> Void) {
      
      let stepType = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
      
      let startDate = Calendar.current.date(byAdding: .day, value: -7, to: Date())
      
      let anchorDate = Date.mondayAt12AM()
      
      let daily = DateComponents(day: 1)
      
      let predicate = HKQuery.predicateForSamples(withStart: startDate, end: Date(), options: .strictStartDate)
      
      let query = HKStatisticsCollectionQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum, anchorDate: anchorDate, intervalComponents: daily)

          healthStore.execute(query)
    
    struct Step {
        let id = UUID()
      var count: Int?
        var date: Date?
    }
      let endDate = Date()
      
    statisticsCollection.enumerateStatistics(from: startDate!, to: endDate) { (statistics, stop) in
          
          let count = statistics.sumQuantity()?.doubleValue(for: .count())
          let steps = Int(count ?? 0)
        
        var stepCount = [Step]()
        var tempStepCount = Step(count: steps, date: Date())
          
        tempStepCount.count = steps
        tempStepCount.date = startDate
        stepCount.append(tempStepCount)
      }
    resolve(Step())
  }


 

Controller.m

 RCT_EXTERN_METHOD(updateStepsCount: (HKStatisticsCollection)someStatisticsCollection
                  resolve: (RCTPromiseResolveBlock)resolve
                  rejecter:(RCTPromiseRejectBlock)reject)

 

Сторона JS:

  clickHandler = async() => {
    const login = HealthkitController.updateStepsCount()
    .then(result => console.warn(result));
  }
 

Ответ №1:

Это потому, что ваш updateStepsCount метод требует аргумент statisticsCollection в качестве первого параметра. Когда вы пытаетесь вызвать updateStepsCount() js, он преобразуется updateStepsCount в objc bridge, но у вас нет этого метода, updateStepsCount: а у этого есть параметр, поэтому вам нужно передать параметр.

ПРИМЕЧАНИЕ: React Native bridge работает только со стандартными типами JSON, поэтому входные параметры могут быть стандартными типами (число, строка, словарь и т.д.), Но вы также можете использовать RCTConvert их для сопоставления с пользовательскими. Результат вашего обещания также должен быть стандартного типа, чтобы вы не могли вернуть свою структуру. (https://reactnative.dev/docs/native-modules-ios#argument-types )