로컬 알림을 구현하는 것 이외에 푸시 알림에 관한 몇 가지 개념을 알아보고자 한다. 앱 푸시 설정상태를 확인하거나 사용자가 알림 권한에 대한 선택을 하기 전에 임시적으로 알림을 보내어 계속 알림을 유지할지 등의 코드를 구현해 볼 수 있다.
실질적으로 로컬 알림을 구현하는 방법이 궁금하다면 이전글을참고하길 바란다.
이전 글 : [SwiftUI] Local Notification 앱의 로컬알림 기능 구현
# 🥨 현재 앱의 알림 관련 설정 상태 확인하는 방법
사용자에게 알림을 보내는 기능을 포함하고 있는 경우 앱의 알림 관련 설정 상태를 확인해야 할 때가 있을 수 있다. 이렇게 사용자의 앱 푸시 설정 상태를 확인하고 싶을 때 우리는 UNUserNotificationCenter.current() 인스턴스의 getNotificationSettings 메서드를 사용한다.
# 🥨 getNotificationSettings 메서드의 매개변수
해당 메서드의 매개변수인 UNNotificationSettings class는 현재 앱의 권한 설정에 대한 정보를 가지고 있다
- UNNotificationSettings class의 authorizationStatus라는 프로퍼티는 열거형으로 다섯가지 값(.notDetermined, .authorized, .denied, .provisional, .ephemeral)을 가지며, authorizationStatus는 알림에 대한 앱의 권한 요청을 했는지의 여부와 사용자가 알림 옵션을 허용했는지 여부를 나타낸다.
- UNNotificationSettings class의 alertSetting 라는 프로퍼티는 열거형으로 세 가지 값(.disabled, .enabled, .notSupported)을 가지며, 유저가 알림을 허용했는지 여부를 나타낸다.
- UNAuthorizationStatus와 UNNotificationSetting의 상태를 확인하고 싶으면 아래의 코드를 통해 추가 코드를 작성하거나 테스트해 볼 수 있다.
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.getNotificationSettings { settings in
switch settings.authorizationStatus {
case .authorized :
print(".authorized 앱이 권한을 요청했고 사용자가 허용한 경우 / rawValue 2")
case .denied :
print(".denied 앱이 권한을 요청했으나 사용자가 거부한경우, 푸시 알림 거부상태인경우 / rawValue 0")
case .notDetermined :
print(".notDetermined 앱이 권한 요청을 하지 않은 경우 / rawValue 1")
case .provisional :
print(".provisional 앱이 권한을 요청했고, 사용자가 임시로 허용한 경우 / rawValue3")
case .ephemeral :
print(".ephemeral 푸시 설정이 App Clip에 대해서만 부분적으로 동의한 경우 / rawValue 4")
default :
print("---")
}
switch settings.alertSetting {
case .disabled :
print(".disabled 알림을 지원하지만 사용자가 알림을 끈경우 / rawValue 1")
case .enabled :
print(".enabled 알림을 지원하고, 사용자가 알림을 허용한 경우 / rawValue 2")
case .notSupported :
print(".notSupported 알림을 지원하지 않는 경우, 애초에 알림 권한 요청을 하지 않는경우 / rawValue 3")
default :
print("---")
}
}
# 🥨 알림 센터에서 임시적으로 알림 권한을 묻는 방법 Provisional Authorization
사용자가 앱에 들어왔을 때 알림에 대한 권한 설정을 물어볼 수 있지만, 이 경우에 사용자가 알림을 받아 보기도 전에 알림 허용에 대한 결정을 해야 하기 때문에 이 경우에 시도적으로 알림을 보내는 provisional authorization을 사용할 수 있다.
# 🥨 provisional authorization 설정방법
처음에 UNUserNotificationCenter.current() 인스턴스의 메서드 requestAuthorization(options: ) 으로 권한 요청을 할 때 options로 넘겨주는 인자로 .provisional도 함께 넘겨주면 된다. 이렇게 하면 설정 (settings)에서 해당앱-알림탭에 아래와 같이 알림 센터에만 조용히 뜨도록 알림센터 항목만 체크가 되어 있고 사운드, 배지도 모두 비활성화되어 있는 것을 볼 수 있다.
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound, .provisional]) { success, error in
guard error == nil else {
print("Error.")
return
}
print("Success")
}
# 🥨 사용자가 받게 되는 임시 알림
위와 같이 .provisional으로 권한 요청을 해주면 앱을 시작할 때 알림 권한 요청에 대한 모달이 뜨지 않고 알림이 처음 가는 시점에 알림센터에(잠금화면이나 배너에 뜨지는 않는다) 아래와 같이 알림을 계속할지에 대한 여부를 묻는다.
- 이 알림에서 계속 받기(Keep)를 선택하면
즉시 전달(Deliver Immediately) / 시간지정요약에 전달(Deliver in Scheduled Summary)이라는 선택사항이 뜬다. 만약 즉시 전달(Deliver Immediately) 옵션만 뜬다면 [설정-알림-시간지정요약탭]에서 설정을 완료해 주면 정상적으로 두 가지 옵션이 함께 뜨게 된다.
이 두 가지 옵션에서 즉시 전달(Deliver Immediately)을 선택하면 알림이 실시간으로 오게 되고, 시간지정요약에 전달(Deliver in Scheduled Summary)을 선택하면 [설정-알림-시간지정요약 탭]에서 설정했던 시간에 알림이 오게 된다. 다만 즉시 전달을 선택하더라도 조용한 알림 (사운드, 배지는 활성화되지 않고, 잠금화면과 배너로 뜨지 않는 알림 센터에만 뜨는 알림)이 유지되기 때문에 사용자가 알림의 다른 기능을 활성화해야 배너, 사운드, 배지로도 뜨게 된다.
- 이 알림에서 끄기 (Turn Off) 를 선택하면
모든 알림 끄기(Turn Off All Notifications) 옵션이 뜨고 이걸 클릭하면 앞으로 알림이 오지 않게 된다. 설정-해당 앱-알림 에 들어가 보면 알림 기능 자체가 비활성화되어 있다.
참고 :
https://yoojin99.github.io/app/User-Notifications/
https://ios-development.tistory.com/1079
https://velog.io/@csk/UNNotificationSetting-vs-UNAuthorizationStatus
'SwiftUI' 카테고리의 다른 글
[SwiftUI] Remote Notification (2) FCM 서비스 사용하여 원격 알림 구현 (0) | 2023.08.22 |
---|---|
[SwiftUI] Remote Notification 원격 알림 (1) (0) | 2023.08.20 |
[SwiftUI] Local Notification 앱의 로컬알림 기능 구현 (0) | 2023.07.17 |
[SwiftUI] 연속한 뷰에 대해 드래그 제스처로 on/off할 수 있는 기능 구현 | 드래그 제스처 .gesture DragGesture (0) | 2023.07.13 |
[SwiftUI] @StateObject 와 @ObservedObject (0) | 2023.06.21 |