Wednesday, September 10, 2025
HomeiOS Developmentios - Issues with SensorKit knowledge calls

ios – Issues with SensorKit knowledge calls


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

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments