관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 앱 푸시 설정 상태 확인 방법 (.authorized, .denied, .notDetermined, .provisional, .ephemeral) 본문

iOS 응용 (swift)

[iOS - swift] 앱 푸시 설정 상태 확인 방법 (.authorized, .denied, .notDetermined, .provisional, .ephemeral)

jake-kim 2022. 8. 10. 01:31

푸시 설정

  • 설정앱에서 푸시 세팅한 것을 코드에서 알아내는 방법?

설정앱 - 유튜브 푸시 세팅

  • 푸시 설정을 바꾸었을때는 바로 알 수 없고, 해당 앱의 foreground에 진입했을때 확인이 가능
  • AppDelegate에서 NotificationCenter를 통해 foreground 상태를 구독하고, 이 안에서 체크

* NotificationCenter 개념은 이전 포스팅 글 참고

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
    NotificationCenter.default.addObserver(
      self,
      selector: #selector(checkNotificationSetting),
      name: UIApplication.willEnterForegroundNotification,
      object: nil
    )

    return true
  }
  
  @objc private func checkNotificationSetting() {
  } 
}
  • 푸시 세팅 확인 방법은UNUserNotificationCenter.current() 인스턴스를 사용
  @objc private func checkNotificationSetting() {
    UNUserNotificationCenter.current()
      .getNotificationSettings { permission in
        switch permission.authorizationStatus  {
// TODO: 분류
      }
  }
  • permission 상태는 5가지가 존재
  @objc private func checkNotificationSetting() {
    UNUserNotificationCenter.current()
      .getNotificationSettings { permission in
        switch permission.authorizationStatus  {
        case .authorized:
          print("푸시 수신 동의")
        case .denied:
          print("푸시 수신 거부")
        case .notDetermined:
          print("한 번 허용 누른 경우")
        case .provisional:
          print("푸시 수신 임시 중단")
        case .ephemeral:
          // @available(iOS 14.0, *)
          print("푸시 설정이 App Clip에 대해서만 부분적으로 동의한 경우")
        @unknown default:
          print("Unknow Status")
        }
      }
  }
  • .authorized: 동의
  • .denied: 거부
  • .notDetermined: `한번 허용`이나 `나중에 선택` 같은 옵션을 선택하고 앱을 종료했다가 다시 킨 경우, 아래처럼 세팅앱에서는 다음번에 묻기로 되어있음
    (다시 시스템 팝업으로 동의할건지 물어봄)

한 번 허용을 누른 경우 -> 다시 키면 다시 물어봄

  • .provisional(임시의): 소리나 배너 없이 사용자에게 알려주는 푸시
    • 아래 사진은 provisional push를 의미

https://support.discord.com/hc/ko/articles/4404980647831--iOS-Provisional-Push-Notifications

  • .empemeral(일시적인): App Clip에서 사용하는 푸시이며, 사용자에게 프롬프트 없이 자동으로 활성화되지만, 8시간 후에 만료
    (푸시에는 아래처럼 사용자에게 비활성화할 수 있는 옵션이 있다는 메시지 포함)

https://onesignal.com/blog/ios-14-and-macos-big-sur-changes-that-affect-push-notifications/

* 참고

https://onesignal.com/blog/ios-14-and-macos-big-sur-changes-that-affect-push-notifications/

https://support.discord.com/hc/ko/articles/4404980647831--iOS-Provisional-Push-Notifications

https://documentation.onesignal.com/docs/ios-provisional-push-notifications

https://developer.apple.com/documentation/usernotifications/unauthorizationoptions/2993019-provisional

Comments