У меня есть приложение Flutter для iOS, которое связано с целью приложения для часов.
Основная функциональность заключается в том, что текущее приложение для часов отслеживает частоту сердечных сокращений пользователя в реальном времени через приложение для часов. Проблема:
Во время отладки я могу скомпилировать приложение, и оно работает нормально на обоих концах, но когда я хочу заархивировать сборку, появляются эти проблемы. Не знаю, как чтобы исправить это или откуда оно появляется. Xcode: Версия 15.0 (15A240d) iOS :
У меня есть приложение Flutter для iOS, которое связано с целью приложения для часов. Основная функциональность заключается в том, что текущее приложение для часов отслеживает частоту сердечных сокращений пользователя в реальном времени через приложение для часов. [b]Проблема:[/b] Во время отладки я могу скомпилировать приложение, и оно работает нормально на обоих концах, но когда я хочу заархивировать сборку, появляются эти проблемы. Не знаю, как чтобы исправить это или откуда оно появляется. [b]Xcode:[/b] Версия 15.0 (15A240d) [b]iOS :[/b] [list] [*]Минимальное развертывание: 17,0 [*]Возможности: фоновые режимы, HealthKit [*]Идентификатор пакета: com.organisation.productName [/list] [b]Приложение для часов:[/b] [list] [*]Минимальное развертывание: 10,0 [*]Возможности: фоновые режимы, HealthKit [*]Идентификатор пакета: com.organisation.productName .watchkit [/list] [b]Приложения/ссылки по проблемам:[/b] Ссылка [b]AppDelegate: [/b] [code]import UIKit import Flutter import WatchConnectivity @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { var session: WCSession?
class WatchViewModel:NSObject, ObservableObject,HKWorkoutSessionDelegate,HKLiveWorkoutBuilderDelegate { func workoutSession(_ workoutSession: HKWorkoutSession, didChangeTo toState: HKWorkoutSessionState, from fromState: HKWorkoutSessionState, date: Date) { print("workoutSession>>didChangeTo \(toState)")
// Wait for the session to transition states before ending the builder. if toState == .ended { builder?.endCollection(withEnd: date) { (success, error) in self.builder?.finishWorkout { (workout, error) in
// WKInterfaceController, HKWorkoutSessionDelegate, func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set) { for type in collectedTypes { if type == HKQuantityType.quantityType(forIdentifier: .heartRate)! { // Handle heart rate data if let statistics = workoutBuilder.statistics(for: type as! HKQuantityType) { let heartRateUnit = HKUnit.count().unitDivided(by: HKUnit.minute()) let value = statistics.mostRecentQuantity()?.doubleValue(for: heartRateUnit) ?? 0 counter = Int(value) sendDataMessage(for: .sendHRToFlutter, data: ["counter": counter]) print("Workout Heart Rate: \(value) BPM") // You can update UI or perform other actions with the heart rate data } } // Handle other collected data types if needed } }
func workoutBuilderDidCollectEvent(_ workoutBuilder: HKLiveWorkoutBuilder) { //if workoutBuilder.workoutEvents.count > 0{ let workoutEvents = workoutBuilder.workoutEvents for event in workoutEvents { print("Work Builder Collect Data : ",event) }
//} }
var session: WCSession let healthStore = HKHealthStore() var builder: HKLiveWorkoutBuilder? var workOutSession: HKWorkoutSession? let queue = OperationQueue()
@Published var counter = 0
// Start the workout. func startWorkout(workoutType: HKWorkoutActivityType) { let configuration = HKWorkoutConfiguration() configuration.activityType = workoutType configuration.locationType = .indoor
// Create the session and obtain the workout builder. do { workOutSession = try HKWorkoutSession(healthStore: healthStore, configuration: configuration) builder = workOutSession?.associatedWorkoutBuilder()
// Set the workout builder's data source. builder?.dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)
// Start the workout session and begin data collection. let startDate = Date() workOutSession?.startActivity(with: startDate) builder?.beginCollection(withStart: startDate) { (success, error) in // The workout has started. print("beginCollection :", success) } }
// Add more cases if you have more receive method enum WatchReceiveMethod: String { case sendHRToNative }
// Add more cases if you have more sending method enum WatchSendMethod: String { case sendHRToFlutter }
// Request authorization to access HealthKit. func requestAuthorization() { // The quantity type to write to the health store. let typesToShare: Set = [ HKQuantityType.workoutType() ]
// The quantity types to read from the health store. let typesToRead: Set = [ HKQuantityType.quantityType(forIdentifier: .heartRate)!, HKObjectType.activitySummaryType() ]
// Request authorization for those quantity types. healthStore.requestAuthorization(toShare: typesToShare, read: typesToRead) { [self] (success, error) in print(success) print(error ?? "No Error") print(self.dataTypesToRead()) var dataType : HKSampleType? dataType = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)! print("readHealthKitData : ", self.readHealthKitData(type: dataType!))
// Serial queue for sample handling and calculations. queue.maxConcurrentOperationCount = 1 queue.name = "MotionManagerQueue"
startWorkout(workoutType: .running)
}
}
private func queryForUpdates(type: HKObjectType) { switch type { case HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!: debugPrint("HKQuantityTypeIdentifierHeartRate")
/// Types of data that this app wishes to write to HealthKit. /// /// - returns: A set of HKSampleType. private func dataTypesToWrite() -> Set { return Set(arrayLiteral: HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!, HKObjectType.workoutType() ) }
func readHealthKitData(type : HKSampleType) { let query = HKSampleQuery(sampleType: type, predicate: nil, limit: 1, sortDescriptors: nil) { (query, results, error) in if let error = error { // Handle query error print("Error querying heart rate: \(error.localizedDescription)") return }
if let heartRateSample = results?.first as? HKQuantitySample { // Access heart rate value let heartRate = heartRateSample.quantity.doubleValue(for: HKUnit(from: "count/min")) // counter = heartRate self.counter = Int(heartRate) self.sendDataMessage(for: .sendHRToFlutter, data: ["counter": self.counter]) print("Heart Rate self.counter: \(self.counter) BPM") // You can update UI or perform other actions with the heart rate data
[/code] [list] [*]Я пытался добавить watchconnectivity.framework в приложение companinon. [*]Условный импорт для WatchKit, но не получилось решение вместо того, чтобы показывать, что используемый компонент недоступен в iOS Демо-видео [/list]
У меня есть приложение Flutter для iOS, которое связано с целью приложения для просмотра. Основная функциональность заключается в том, что текущее приложение для часов отслеживает частоту сердечных сокращений пользователя в реальном времени через...
У меня есть приложение для iOS Flutter, которое ассоцильно адантируется с целью Watch App.
Основная функциональность заключается в том, что текущее приложение для наблюдения отслеживает живую частоту сердечных сокращений пользователя через...
У меня есть приложение WatchKit, которое отлично работает в симуляторе. Но когда я пытаюсь запустить его на реальном устройстве, он никогда не завершает установку и не выдает никаких сообщений об ошибках или отзывов.
В 2017 году я создал приложение для часов, используя парадигму Watch App и Watch App Extension. Я нажал кнопку «Обновить до рекомендуемых настроек» в Xcode, и теперь мое приложение не будет собираться ни на одно устройство, а Xcode сообщает «Не...