Swift 오답노트 - DateComponent Weekday

Younkyum J·2023년 4월 19일
2

iOS

목록 보기
3/3
post-thumbnail

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 일때 금요일이라고 하더라... 갑자기 신뢰가 떨어졌다...
profile
기획자입니다. 근데 이제 고양이와 애플덕후와 개발을 곁들인.

0개의 댓글