SwiftUI

[SwiftUI] Notification | 알림설정확인 getNotificationSettings Provisional Authorization

하이D:) 2023. 7. 26. 14:20

로컬 알림을 구현하는 것 이외에 푸시 알림에 관한 몇 가지 개념을 알아보고자 한다. 앱 푸시 설정상태를 확인하거나 사용자가 알림 권한에 대한 선택을 하기 전에 임시적으로 알림을 보내어 계속 알림을 유지할지 등의 코드를 구현해 볼 수 있다.

실질적으로 로컬 알림을 구현하는 방법이 궁금하다면 이전글을참고하길 바란다.

 

이전 글 : [SwiftUI] Local Notification 앱의 로컬알림 기능 구현


# 🥨  현재 앱의 알림 관련 설정 상태 확인하는 방법

사용자에게 알림을 보내는 기능을 포함하고 있는 경우 앱의 알림 관련 설정 상태를 확인해야 때가 있을 있다. 이렇게 사용자의 푸시 설정 상태를 확인하고 싶을 우리는 UNUserNotificationCenter.current() 인스턴스 getNotificationSettings 메서드 사용한다.

 

# 🥨 getNotificationSettings 메서드 매개변수

해당 메서드의 매개변수인 UNNotificationSettings class 현재 앱의 권한 설정에 대한 정보 가지고 있다

    • UNNotificationSettings classauthorizationStatus라는 프로퍼티는 열거형으로 다섯가지 (.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://developer.apple.com/documentation/usernotifications/unauthorizationoptions/2993019-provisional

https://ios-development.tistory.com/1079

https://velog.io/@csk/UNNotificationSetting-vs-UNAuthorizationStatus