개발
[Swift] 오답노트 - DateComponent Weekday
Onve
2024. 4. 15. 21:31
Swift로 로컬 푸시 알림을 구현하는 중에 문제가 발생했다.
알림을 매주 특정 요일에 반복하게 하기 위해서 다음과 같은 코드를 작성했었다.
func makeTriggerForNoti(hour: Int, minute: Int, dayidx: Int) -> UNCalendarNotificationTrigger {
var tTimeInt = hour * 60 + minute
let tDuringInt = Int(sleepTime)/60
var dateInt = dayidx
print(tTimeInt, tDuringInt)
tTimeInt -= tDuringInt
if tTimeInt < 0 {
tTimeInt += 1440
dateInt -= 1
if dateInt < 0 {
dateInt += 7
}
}
var dateComponent = DateComponents()
dateComponent.calendar = Calendar.current
dateComponent.weekday = dateInt
dateComponent.hour = tTimeInt / 60
dateComponent.minute = tTimeInt % 60
return UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: true)
}
하지만, 테스트를 진행해본 결과 알림이 오지 않는 문제가 발생하였다.
문제는 Weekday
알고보니 문제는 trigger에 들어가는 dateComponent의 문제였다.
그리고, 이 dateComponent의 매주 반복을 위해 설정한 Weekday의 인덱스가 잘못된 것이었다.
내가 생각한 weekday는 다음과 같았다.
[Sunday : 0, Monday : 1, Tuesday : 2, Wednesday : 3, Thursday : 4, Friday : 5, Saturday : 6]
알고보니 당연히 Index가 0부터 시작할 것이라고 생각한 것이 문제였다.
개발자 문서를 보고 난 뒤에야 문제의 이유를 깨달았다.
The corresponding value is an NSInteger. Equal to kCFCalendarUnitWeekday. The weekday units are the numbers 1 through N (where for the Gregorian calendar N=7 and 1 is Sunday).
따라서 실제 구조는 다음과 같다.
[Sunday : 1, Monday : 2, Tuesday : 3, Wednesday : 4, Thursday : 5, Friday : 6, Saturday : 7]
Weekday Index는 0부터 시작하는 것이 아닌, 1부터 Index가 시작된다. 이를 해결하고 나니 알림이 정상적으로 오는 것을 알 수 있었다.
Chat GPT에도 물어봤는데 얘는 또 Weekday = 5 일때 금요일이라고 하더라...
본 글은 이전 Velog에서 가져온 글입니다. 원본 글은 여기를 클릭해서 들어가주세요.