The Deligate ‘didFetchResult’ methodology of fetching knowledge previous 24 hours from SensorKit will not be being referred to as. It’s confirmed that you’ve already granted full entry to the SensorKit and that knowledge on the Ambient worth within the gadget’s private data -> analysis sensor & utilization knowledge are recorded.
It’s potential to export to an lz4 file. I need to have the info after 24 hours referred to as to the app, however different Deligate strategies are referred to as, however solely Deligate that will get the illumination worth will not be referred to as. Is it understood that solely knowledge previous 24 hours might be imported after startRecoding() known as?
In that case, with a purpose to obtain knowledge previous 24 hours, do I’ve to proceed to obtain the illumination knowledge worth within the background for greater than 24 hours to obtain the Ambient worth afterwards?
import Basis
import SensorKit
import UIKit
ultimate class SensorKitManager: NSObject, ObservableObject, SRSensorReaderDelegate {
static let shared = SensorKitManager()
non-public let ambientReader = SRSensorReader(sensor: .ambientLightSensor)
var availableDevices: [SRDevice] = []
@Printed var ambientLightData: [AmbientLightDataPoint] = []
var isFetching = false
var isRecordingAmbientLight = false
non-public override init() {
tremendous.init()
setupReaders()
checkAndRequestAuthorization()
}
non-public func setupReaders() {
ambientReader.delegate = self
}
// MARK: - Permission Request
func requestAuthorization() {
SRSensorReader.requestAuthorization(sensors: [.ambientLightSensor]) { [weak self] error in
DispatchQueue.foremost.async {
guard let self = self else {
print("Permission request aborted")
return
}
if let error = error {
print("Permission request failed: (error.localizedDescription)")
} else {
print("Permission request succeeded")
self.startRecordingAmbientLightData()
}
}
}
}
func checkAndRequestAuthorization() {
let standing = ambientReader.authorizationStatus
change standing {
case .licensed:
print("Ambient gentle sensor entry granted")
startRecordingAmbientLightData()
case .notDetermined:
print("Ambient gentle sensor entry undetermined, requesting permission")
requestAuthorization()
case .denied:
print("Ambient gentle sensor entry denied or restricted")
@unknown default:
print("Unknown authorization standing")
}
}
// MARK: - Ambient Mild Knowledge Logic
func startRecordingAmbientLightData() {
guard !isRecordingAmbientLight else {
print("Already recording ambient gentle knowledge.")
return
}
print("Beginning ambient gentle knowledge recording")
isRecordingAmbientLight = true
ambientReader.startRecording()
fetchAmbientLightData()
fetchAmbientDeviceData()
}
func fetchAmbientLightData() {
print("Fetching ambient gentle knowledge")
let request = SRFetchRequest()
let now = Date()
let fromTime = now.addingTimeInterval(-72 * 60 * 60)
let toTime = now.addingTimeInterval(-25 * 60 * 60)
request.from = SRAbsoluteTime(fromTime.timeIntervalSinceReferenceDate)
request.to = SRAbsoluteTime(toTime.timeIntervalSinceReferenceDate)
print("Fetch request: (fromTime) ~ (toTime)")
ambientReader.fetch(request)
}
non-public func displayAmbientLightData(pattern: SRAmbientLightSample) {
print("Ambient gentle: (pattern.lux.worth) lux")
print("Present ambientLightData content material:")
for knowledge in ambientLightData {
print("Timestamp: (knowledge.timestamp), Lux: (knowledge.lux)")
}
}
// MARK: - System Knowledge Logic
non-public func fetchAmbientDeviceData() {
print("Fetching gadget data")
let request = SRFetchRequest()
let now = Date()
let fromDate = now.addingTimeInterval(-72 * 60 * 60)
let toDate = now.addingTimeInterval(-24 * 60 * 60)
request.from = SRAbsoluteTime(fromDate.timeIntervalSinceReferenceDate)
request.to = SRAbsoluteTime(toDate.timeIntervalSinceReferenceDate)
if availableDevices.isEmpty {
print("No gadgets accessible")
ambientReader.fetchDevices()
} else {
for gadget in availableDevices {
print("Beginning knowledge fetch (System: (gadget))")
request.gadget = gadget
ambientReader.fetch(request)
print("Fetch request despatched (System: (gadget))")
}
}
}
// MARK: - SRSensorReaderDelegate Strategies
func sensorReader(_ reader: SRSensorReader, didFetch gadgets: [SRDevice]) {
availableDevices = gadgets
for gadget in gadgets {
print("Fetched gadget: (gadget)")
}
if !gadgets.isEmpty {
fetchAmbientDeviceData()
}
}
func sensorReader(_ reader: SRSensorReader, fetching fetchRequest: SRFetchRequest, didFetchResult outcome: SRFetchResult) -> Bool {
print("sensorReader(_:fetching:didFetchResult:) methodology referred to as")
if let ambientSample = outcome.pattern as? SRAmbientLightSample {
let luxValue = ambientSample.lux.worth
let timestamp = Date(timeIntervalSinceReferenceDate: outcome.timestamp.rawValue)
// Examine for duplicate knowledge and add it
if !ambientLightData.incorporates(the place: { $0.timestamp == timestamp }) {
let dataPoint = AmbientLightDataPoint(timestamp: timestamp, lux: Float(luxValue))
ambientLightData.append(dataPoint)
print("Added ambient gentle knowledge: (luxValue) lux, Timestamp: (timestamp)")
} else {
print("Duplicate knowledge, not including: Timestamp: (timestamp)")
}
// Output knowledge
self.displayAmbientLightData(pattern: ambientSample)
}
return true
}
func sensorReader(_ reader: SRSensorReader, didCompleteFetch fetchRequest: SRFetchRequest) {
print("Knowledge fetch full")
if ambientLightData.isEmpty {
print("No ambient gentle knowledge inside 24 hours.")
} else {
print("ambientLightData up to date")
for dataPoint in ambientLightData {
print("Added ambient gentle knowledge: (dataPoint.lux) lux, Timestamp: (dataPoint.timestamp)")
}
}
}
}
I’ve executed just about every little thing to get the didFetchResult worth.
Whereas doing this, what I’m conscious of is that solely knowledge previous 24 hours might be fetched, and it’s judged that the tactic of didFetchResult will not be referred to as as a result of the info previous 24 hours will not be fetched.
I do not know why I am unable to get this worth when the illuminance worth is being constructed up usually day-after-day on the gadget