개발

[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에서 가져온 글입니다. 원본 글은 여기를 클릭해서 들어가주세요.