# SleepTrackingManager # Create manager ### Asleep.createSleepTrackingManager() ```swift var config: Asleep.Config? let delegate: AsleepSleepTrackingManagerDelegate = self var manager: Asleep.SleepTrackingManager? if let config { manager = Asleep.createSleepTrackingManager(config: config, delegate: delegate) } ``` | Property Name | Type | Description | | :------------ | :------------------- | :------------------------------------- | | config | Asleep.Config | Enter the Asleep.Config instance | | delegate | AsleepConfigDelegate | Delegate to receive results and errors | ### AsleepSleepTrackingManagerDelegate ```swift protocol AsleepSleepTrackingManagerDelegate { func didCreate() func didUpload(sequence: Int) func didClose(sessionId: String) func didFail(error: Asleep.AsleepError) func didInterrupt() func didResume() func micPermissionWasDenied() func analysing(session: Asleep.Model.Session) } ``` 1. didCreate()\ Tracking is generated. 2. didUpload()\ Data is uploaded. | Property Name | Type | Description | | :------------ | :--- | :------------------------------------------------------------- | | sequence | Int | A value that starts from 0 and increases by 1 every 30 seconds | 3. didClose()\ Tracking is terminated. | Property Name | Type | Description | | :------------ | :----- | :--------------------- | | sessionId | String | Report result id value | 4. didFail()\ Due to error, tracking is ended | Property Name | Type | Description | | :------------ | :----------------- | :----------------------------- | | error | Asleep.AsleepError | [Error Codes](ios-error-codes) | 5. didInterrupt()\ Tracking is interrupted due to events such as calls. 6. didResume()\ Tracking resumes once the interrupting factor is resolved. 7. micPermissionWasDenied()\ Tracking cannot be started without microphone permission. 8. analysing()\ Latest session data | Property Name | Type | Description | | :------------ | :------------------- | :-------------------------------------------- | | session | Asleep.Model.Session | during analysis, tracking session information | *** # Concurrent Audio Capture (optional) ### Asleep.SleepTrackingManager.setDeliveryDelegate() ```swift var trackingManager = Asleep.createSleepTrackingManager(config: config, delegate: delegate) trackingManager?.setDeliveryDelegate(self) ``` ### Asleep.AsleepAudioDeliveryManagerDelegate ```swift protocol AsleepAudioDeliveryManagerDelegate: AnyObject { func deliveryAudio(didReceiveRawBuffer buffer: AVAudioPCMBuffer, at time: AVAudioTime) } ``` > 🚧 Use only when simultaneous SDK–client recording is required > > This function is used to comply with Apple’s recommendation of maintaining a single Audio Session in iOS,\ > while ensuring stable audio recording in scenarios where both the SDK and the client need to handle audio simultaneously. > It is specifically designed to deliver PCM data to the client in real time at the InputNode level. *** # Start sleep tracking ### Asleep.SleepTrackingManager.startTracking() * You can now pass audio session options to the startTracking() method. (Link) ```swift var manager: Asleep.SleepTrackingManager? manager?.startTracking() ``` > 🚧 Follow the guideline for testing the sleep tracking > > To accurately test Asleep's sleep tracking/analysis, 
please follow the test environment guide. Please note that sleep analysis results obtained 
in environments not adhering to this guide may not accurately reflect actual sleep patterns. > > 🔗 Check [Test Environment Guideline](sleep-environment-guideline) *** # Request the latest analyzed sleep data ### Asleep.SleepTrackingManager.requestAnalysis() ```swift var manager: Asleep.SleepTrackingManager? manager?.requestAnalysis() ``` *** # Stop sleep tracking ### Asleep.SleepTrackingManager.stopTracking() ```swift var manager: Asleep.SleepTrackingManager? manager?.stopTracking() ``` *** # Get sleep tracking status ### Asleep.SleepTrackingManager.getTrackingStatus() ```swift var manager: Asleep.SleepTrackingManager? let trackingStatus = manager?.getTrackingStatus() ``` *** # Resume tracking ### Asleep.SleepTrackingManager.resumeTracking() * If a cannotActivateInBackground error occurs during sleep tracking, notify the user (e.g., through a notification), and run Asleep.SleepTrackingManager.resumeTracking() while the app is in the foreground. ```swift var manager: Asleep.SleepTrackingManager? manager?.resumeTracking() ``` *** # Data Type ### Asleep.SleepTrackingManager.TrackingStatus ```swift struct TrackingStatus { var sessionId: String? } ```
Property name Type Description
sessionId String? Currently tracking session id Available from the didCreate function of AsleepSleepTrackingManagerDelegate Valid until the corresponding Session is closed
### Asleep.Model.Session ```swift struct Session { let id: String let state: State let startTime: Date let endTime: Date? let unexpectedEndTime: Date? let createdTimezone: String let sleepStages: [Int]? let snoringStages: [Int]? } enum State { case open case closed case complete } ```
Property name Type Description Version
id String Sleep session id
state Asleep.Model.State Sleep session state (`OPEN`, `CLOSED`, or `COMPLETE`)
startTime Date Session start time
endTime Date? Session end date
unexpectedEndTime Date? If a session fails to proceed and terminate properly due to app crashes or similar issues, and the client later executes `initConfig` to terminate the session, the time at which this happens is recorded. In this case, the "end\_time" is calculated based on the sequence number of the last uploaded audio file. Therefore, if "end\_time" is not null, it indicates an abnormal session.
createdTimezone String Timezone of session creation ([Timezone List](https://drive.google.com/file/d/1UAuRVJagopKzEFZ7KvQY3fFpIalw8W8u/view?usp=sharing))
sleepStages Array\ Sleep stages `-1`: error `0` : wake `1` : light `2` : deep `3` : rem
snoringStages Array\ Snoring stages `-1`: error `0` : no snoring `1` : snoring