HealthKitHostApiImpl.swift
2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import Foundation
import HealthKit
final class HealthKitHostApiImpl: HealthKitHostApi {
private let service: HealthKitService
init(service: HealthKitService = .shared) {
self.service = service
}
func checkHealthAppAuthorization(completion: @escaping (Result<HealthAuthorization, Error>) -> Void) {
Task {
let authorization: HealthAuthorization
let requestStatus: HKAuthorizationRequestStatus?
if !service.isHealthDataAvailable {
requestStatus = nil
authorization = HealthAuthorization(status: -1, hasData: false)
} else {
requestStatus = await service.authorizationRequestStatus()
if requestStatus == .shouldRequest {
authorization = HealthAuthorization(status: 0, hasData: false)
} else {
let oneMonthAgo = Calendar.current.date(byAdding: .month, value: -1, to: Date())
?? Date(timeIntervalSinceNow: -30 * 24 * 60 * 60)
let hasData = await service.hasAnyReadableData(startingAt: oneMonthAgo)
authorization = HealthAuthorization(status: hasData ? 1 : 2, hasData: hasData)
}
}
DebugLogger.debugLog(
"checkHealthAppAuthorization result: requestStatus=\(String(describing: requestStatus)) status=\(authorization.status) hasData=\(authorization.hasData)"
)
completion(.success(authorization))
}
}
func requestHealthClientAuthorization(completion: @escaping (Result<Bool, Error>) -> Void) {
DebugLogger.debugLog("requestHealthClientAuthorization")
service.requestAuthorization { [service] success, error in
if let error {
DebugLogger.debugLog("requestHealthClientAuthorization error: \(error)")
completion(.failure(error))
return
}
DebugLogger.debugLog("requestHealthClientAuthorization granted: \(success)")
if success {
service.restartBackgroundObserversAfterAuthorization()
}
completion(.success(success))
}
}
func syncHealthDataToCloud(completion: @escaping (Result<Bool, Error>) -> Void) {
// Huawei Health manual cloud synchronization is HarmonyOS-specific.
completion(.success(false))
}
func readActivityGoal(completion: @escaping (Result<HealthActivityGoal?, Error>) -> Void) {
// Activity-ring goals are read through Health Service Kit on OHOS only.
completion(.success(nil))
}
func readWorkoutData(startTime: Int64, endTime: Int64, completion: @escaping (Result<[HealthWorkoutDataPoint], Error>) -> Void) {
// Workout records are read through Health Service Kit on OHOS only.
completion(.success([]))
}
}