1. 권한 설정 주요 이슈
https://forums.developer.apple.com/forums/thread/655882
https://developer.apple.com/documentation/sensorkit/configuring_your_project_for_sensor_reading
권한 설정에 필요한 infoPlist에 값을 넣을때 그냥 String에 안내 문구만 넣었으나 값이 제대로 진행되지 않음 → Dictionary 형태로 사용해야 가능하다
** 추가적으로 권한 설정 후 또다시 권한 설정하는 메서드를 호출하게 되면 오류가 발생해 권한을 거부한 것으로 표시되니 꼭 기억하자 불필요한 권한 호출을 방지해야함
2. 권한 설정 시 중복 권한 요청으로 인한 오류 해결 문제
SensorKit은 기존 권한을 허용한 상태에서 추가적으로 권한을 요청하는 로직이 실행될 경우, 추가적인 권한 요청에 의한 오류가 발생한다.
Error requesting authorization: Error Domain=SRErrorDomain Code=8201 "(null)"
Invalid authorization request. Requested services are already authorized: Error Domain=SRErrorDomain Code=8201 "(null)"
해당 오류는 8201 Error 로 확인된다.
이를 해결하기 위해 권한 상태에 따른 추가적인 로직이 필요하다.
그렇지만 일반적인 방식으로 권한을 호출하면 제대로 구현되지 않는 문제가 있었다.
let status = SensorKit.SRSensorReader.authorizationStatus(for: .ambientLightSensor)
SRSensorReader를 통해 authorizationStatus를 직접 구현하면
Cannot call value of non-function type 'SRAuthorizationStatus'
Cannot infer contextual base in reference to member 'ambientLightSensor'
Instance member 'authorizationStatus' cannot be used on type 'SRSensorReader'; did you mean to use a value of this type instead?
라는 오류가 나게 된다.
그 이유는 authorizationStatus의 접근 방식이 다르다는 것
authorizationStatus는 클래스 메서드가 아닌 인스턴스 프로퍼티이기 때문에 SRSensorReader.authorizationStatus와 같이 타입에서 호출이 불가하다.
SRSensorReader의 인스턴스를 생성한 후 authorizationStatus 프로퍼티에 접근하는 것이 중요하다.
func checkAuthorization() {
let reader = SRSensorReader(sensor: SRSensor.ambientLightSensor)
let status = reader.authorizationStatus
// 권한 상태에 따라 처리
}
이런 방식으로!
func checkAuthorization() {
let sensor = SRSensor.ambientLightSensor // 또는 SRSensorType.ambientLightSensor
let reader = SRSensorReader(sensor: sensor)
let status = reader.authorizationStatus
switch status {
case .authorized:
print("조도 센서에 대한 접근이 허가되었습니다.")
// 센서 데이터 수집 시작
startRecordingAmbientLightData()
case .notDetermined:
print("조도 센서 권한이 아직 결정되지 않았습니다.")
// 권한 요청
requestAuthorization()
case .denied:
print("조도 센서에 대한 접근이 거부되었습니다.")
// 필요한 처리 수행
@unknown default:
print("알 수 없는 권한 상태입니다.")
}
}
그렇게 구현한 내용을 이렇게 사용할 수 있게 된다.
3. 데이터를 페치하는데 새로운 이슈 - 24시간 이후 데이터 페치가 가능하다.
1. A fetch query can retrieve only sensor data that the app records by first calling startRecording()..2. SensorKit places a 24-hour holding period on newly recorded data before an app can access it. This gives the user an opportunity to delete any data they don’t want to share with the app. A fetch request doesn’t return any results if its time range overlaps this holding period.
공식 문서 내 24시간 내 데이터는 유저가 데이터를 감지하고 수정할 수 있는시간이 있어야 한다. 그렇기 때문에 24시간 이후 데이터를 가져올 수 있다. 데이터가 레코딩 된 순간 이후 바로 데이터 페치를 요청하면 가져올 데이터가 없다. 24시간이 지나야 데이터 호출이 가능해진다.
9월 19일 자로 해결해나가고 있는 트러블 슈팅에 대해서 정리했다 당분간 SensorKit을 활용한 데이터 페치를 진행할 예정이므로 더 추가하고 지속적으로 업데이트해서 SensorKit 정보를 모아두려고 한다 .. 오늘은 여기까지!!!
'◽️ Programming > iOS' 카테고리의 다른 글
Background Data Fetch 하기 (0) | 2024.10.08 |
---|---|
SensorKit Data Fetch 하는 법 (0) | 2024.10.04 |
HealthKit에 대해서 알아보고 데이터 가져오기 :) (2) | 2024.09.04 |
Clean Architecture에 대해서 알아보자 :) (0) | 2024.09.02 |
Swift에서 프로토콜 지향 프로그래밍(POP)에 대해서 알아보자 (0) | 2024.08.23 |