- 개발 일자 : 2022. 1. 26
이전까지 구현한 것은 알람을 추가하거나 수정 및 삭제했을 때 선택한 시간 및 사운드 등을 포함한 알람 정보가 AlarmManager 에 적용되도록 하였다.
이제 해당 알람 정보를 토대로 실제로 notification 을 통한 알람이 울리도록 해야하는데, 이전에 AlarmListVC 에서 왼쪽 상단의 바 버튼을 눌렀을 때 ~초 후에 notification 이 오도록 구현했었는데 해당 코드를 AlarmManager 로 옮겨왔다.
AlarmListVC 에 notification(UNUserNotificationCenter.current()
) 프로퍼티가 있었는데 해당 프로퍼티도 AlarmManager 로 가져왔고 Notification 권한과 관련된 것은 해당 뷰컨트롤러가 로드될 때 설정하는 것이 좋을 듯해서 그대로 남겨두었다.
이 때, 이전에 사용한 notification 프로퍼티가 필요해서 AlarmManager 객체의 프로퍼티를 사용하도록 수정하였다.
일단 notification 을 등록하는 함수를 새로 정의했는데 구현 내용은 다음과 같다
- notification 을 추가할 알람 객체를 받아왔고
- 해당 알람 객체를 토대로 sound 정보나 date(time), identifier 정보를 사용했다
- 이전 테스트 시 사용한 코드와 다르게
UNCalendarNotificationTrigger
를 사용해 특정 시간에 알람이 울리도록 설정했다
private func scheduleAlarm(alarm: Alarm) {
let content = UNMutableNotificationContent()
content.title = "알람"
content.body = "이것은 알림을 테스트 하는 것이다"
content.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: getSoundTitle(at: alarm.soundIndexPath) + ".mp3"))
let calendar = Calendar.current
let date = calendar.dateComponents([.day, .hour, .minute], from: alarm.time)
print(date)
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: false)
let request = UNNotificationRequest(identifier: alarm.identifier.uuidString,
content: content,
trigger: trigger)
notification.add(request) { error in
if let error = error {
print("Notification Error: ", error)
}
}
}
고민 사항
이제 알람이 추가/수정/삭제되었을 때 알람 notification 을 재설정하도록 해야하는데
처음엔 가장 가까운 시간의 notification 만 추가해두려고 했다 (뭔가 이게 더 효율적이라고 생각이 들었었다)
그래서 새로 추가되거나 변동되면 기존 등록된 notification을 삭제하고 최신 알람만 등록하려 했는데
생각해보니 알람을 확인하지 않는다면 다음 알람을 등록할 방법이 없게되니까
켜져있는 알람에 대해서 모두 추가되어있는 것이 낫다고 판단되었다
따라서 알람이 재 설정되어야 하는 경우를 생각해보았는데
1. 알람이 추가되었을 때
→ 추가된 알람에 대해 nofication 을 등록
2. 알람이 수정되었을 때
→ 켜져있는 알람인 경우, 기존 등록되어 있는 notification 을 삭제하고 다시 등록
3. 알람이 삭제되었을 때
→ 켜져있던 알람인 경우, 기존 등록되어 있는 알람 notification 삭제
4. 알람 스위치가 켜지거나 껴졌을 때
- ON → OFF : 기존 등록되어 있는 알람 notification 삭제
- OFF → ON : 알람 notification 추가
따라서 각각의 경우에 알맞게 코드를 작성하였다
// 1. 알람 추가 시,
func add(alarm: Alarm) {
alarms[0].append(alarm)
alarms[0].sort()
scheduleAlarm(alarm: alarm)
}
// 2. 알람 수정 시,
func setAlarm(to alarm: Alarm, at indexPath: IndexPath) {
alarms[indexPath.section][indexPath.row] = alarm
if alarm.isOn {
notification.removePendingNotificationRequests(withIdentifiers: [alarm.identifier.uuidString])
scheduleAlarm(alarm: alarm)
}
}
// 3. 알람 삭제 시,
func delete(alarmRowAt indexPath: IndexPath) {
let alarm = alarms[indexPath.section].remove(at: indexPath.row)
if alarm.isOn {
notification.removePendingNotificationRequests(withIdentifiers: [alarm.identifier.uuidString])
}
}
// 4. 알람 스위치가 변경되었을 시,
func alarmSwitched(to isOn: Bool, alarmRowAt indexPath: IndexPath) {
...
// Off -> ON
if isOn {
scheduleAlarm(alarm: alarm)
// ON -> OFF
} else {
notification.removePendingNotificationRequests(withIdentifiers: [alarm.identifier.uuidString])
}
}
'# iOS | Swift > --- Project' 카테고리의 다른 글
[Alarm] #+3. 알람 레이블 화면 추가 (0) | 2022.02.25 |
---|---|
[Alarm] 1. 기본 알람 목록 및 추가화면 구현, AlarmManager, 삭제 기능 추가 (0) | 2022.02.25 |
[Alarm] #+2. 상세 화면에서 알람 삭제 기능 및 알람 시간 텍스트 표시 수정 (0) | 2022.02.03 |
[Alarm] #+1. 알람 편집 모드 구현 (0) | 2022.02.03 |
[Alarm] #-1. 사운드 옵션 화면 추가 및 선택한 알람 사운드 전달하기 (0) | 2022.01.26 |