#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 )