[WWDC18 Review #4] What’s New in User Notification

Grouped Notifications

iOS 12부터 모든 노티피케이션은 앱을 기준으로 그룹핑 됩니다.

노티피케이션 그룹을 터치하면 그룹에 포함된 모든 노티피케이션이 표시됩니다.

앱으로 전달된 노티피케이션은 기본적으로 App Group에 추가되지만 Thread Identifier를 활용해서 커스텀 그룹을 생성할 수 있습니다. 노티피케이션을 사용자 별로 그룹핑하거나 특정 이벤트를 기준으로 그룹핑 할 수 있습니다. Thread Identifier를 지정해 두면 자동으로 새로운 그룹이 생성되고 동일한 Thread Identifier를 가진 노티피케이션은 App Group 대신 이 그룹으로 전달됩니다.

let content = UNMutableNotificationContent()
content.title = "New Photo"
content.body = "Jane Doe posted a new photo"
content.threadIdentifier = "thread-identifier"
{  
   "aps":{  
      "alert":{  
         "title":"New Photo",
         "body":"Jane Doe posted a new photo",
         "thread-id":"thread-identifier"
      }
   }
}

사용자는 설정 앱을 통해서 그룹핑 방식을 지정할 수 있습니다.

Notification Content Extension

iOS 12부터 Notification Action을 동적으로 업데이트 할 수 있습니다. 이전 버전에서는 앱 초기화 시점에 카테고리를 생성하고 액션을 추가한 다음 User Notification Center에 등록해야 했지만, iOS 12부터 카테고리와의 연관성이 제거되었습니다. 그래서 Extension 내에서 표시할 액션 목록을 자유롭게 업데이트 할 수 있습니다.

extension NSExtensionContext {
    @available(iOS 12.0, *)
    var notificationActions: [UNNotificationAction]
}

새롭게 추가된 notificationActions 속성을 통해 현재 설정되어 있는 액션 목록을 얻거나 새로운 목록을 설정할 수 있습니다.

class NotificationViewController: UIViewController, UNNotificationContentExtension {
   func didReceive(_ response: UNNotificationResponse, completionHandler completion:
      (UNNotificationContentExtensionResponseOption) -> Void) {
      if response.actionIdentifier == "like-action" {
         // Update state...
         let unlikeAction = UNNotificationAction(identifier: "unlike-action",
                                                 title: "Unlike", options: [])
         let currentActions = extensionContext?.notificationActions
         let commentAction = currentActions![1]
         let newActions = [ unlikeAction, commentAction ]
         extensionContext?.notificationActions = newActions
      }
   }
}

iOS 12부터 Custom UI에서 터치 이벤트를 처리할 수 있습니다. Info.plist 파일에 UNNotificationExtensionUserInteractionEnabled 키를 추가하고 값을 YES로 설정하면 이벤트 처리가 활성화 됩니다.

NSExtensionContext에는 새로운 메소드도 추가되었습니다.

extension NSExtensionContext {
   @available(iOS 12.0, *)
   func performNotificationDefaultAction()
   func dismissNotificationContentExtension()
}

사용자의 터치 없이 Default Action과 Dismiss Action을 코드로 실행할 수 있습니다. 하지만 Dismiss Action을 코드로 실행했을 때 노티피케이션 센터에서 자동으로 제거되지는 않습니다. 이 경우에는 UNUserNotificationCenter가 제공하는 API를 통해서 직접 제거해야 합니다.

Notification Management

노티피케이션 설정과 관련된 UI가 개선되었습니다. 설정 앱을 실행하지 않고 새로운 Management View에서 설정을 변경할 수 있습니다.

여기에서 조용히 전달(Deliver Quietly)을 선택하면 사운드나 배너는 표시되지 않고 노티피케이션 센터에 추가됩니다. 끄기(Turn off..)를 선택해서 노티피케이션을 받지 않도록 설정할 수도 있습니다.

그리고 주기적으로 현재 설정에 대해서 확인을 요청합니다. 이 메뉴를 통해 설정을 그대로 유지하거나 바꿀 수 있습니다.

Custom Setting View를 직접 구현할 수 있습니다. 사용자는 Management View와 설정 앱에 표시된 메뉴를 통해서 이 뷰에 접근할 수 있습니다.

UNUserNotificationCenterDelegate 프로토콜에 새로운 메소드가 추가되었습니다. 이 메소드를 구현하면 앞에서 언급한 메뉴가 표시됩니다. 그리고 사용자가 메뉴를 탭하면 이 메소드가 호출됩니다. 이 메소드에서 Custom Setting View를 표시하도록 구현해야 합니다. Management View에 표시된 메뉴를 통해 호출된 경우에는 두 번째 파라미터에 연관된 노티피케이션 객체가 전달됩니다. 설정 앱에 표시된 메뉴를 통해 호출되었다면 nil이 전달됩니다.

func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification? ) {
   // ...
}

Provisional Authorization

노티피케이션을 전달하는 앱은 사용자로부터 허가를 얻어야 합니다. 이런 앱을 시작하면 최초에 경고창이 표시됩니다.

UNAuthorizationOptions 구조체에 새로운 .provisional 옵션이 추가되었고 권한을 요청하는 코드에 이 옵션을 추가하면 사용자의 허가없이 임시 노티피케이션을 전달할 수 있습니다.

notificationCenter.requestAuthorization(options:[.badge, .sound, .alert, .provisional]) { ... }

임시 노티피케이션은 사운드를 재생하거나 배너 형태로 표시되지 않고 노티피케이션 센터에 추가됩니다. 사용자는 노티피케이션이 어떤 내용을 담고 있는지 직접 확인하고 허가 여부를 선택할 수 있습니다.

Critical Alerts

방해 금지 모드(Do Not Disturb)가 활성화 되어 있거나 무음 모드로 설정되어 있으면 노티피케이션이 전달되었다는 것을 인식하기 어렵습니다. 하지만 노티피케이션에는 사용자가 반드시 확인하고 어떤 행동을 취해야 하는 중요한 정보가 포함되어 있을 수도 있습니다.

iOS 12부터 이런 노티피케이션들을 Critical Alert로 전달할 수 있습니다. Critical Alert는 사용자가 노티피케이션을 바로 확인할 수 있도록 방해 금지 모드나 무음 모드에 관계없이 항상 사운드를 재생합니다.

Critical Alert는 악용될 소지가 있기 때문에 몇 가지 제약을 가지고 있습니다. Custom Alert를 보내려면 애플로부터 Critical Alerts Entitlement를 발급받아야 합니다. 그리고 건강, 의료, 보안 등 일부 카테고리에 제한적으로 허용됩니다.

애플로부터 Critical Alerts Entitlement를 발급 받았다면 권한을 요청할 때 새로운 .criticalAlert 옵션을 추가할 수 있습니다.

notificationCenter.requestAuthorization(options:[.sound, .badge, .alert, .criticalAlert]) { ... }

노티피케이션을 전달할 때는 sound를 UNNotificationSound.defaultCritical로 설정합니다.

let content = UNMutableNotificationContent()
content.title = "WARNING: LOW BLOOD SUGAR"
content.body = "Glucose level at 57."
content.categoryIdentifier = "low-glucose—alert"
content.sound = UNNotificationSound.defaultCritical

커스텀 사운드를 설정하고 사운드 볼륨을 직접 지정하려면 아래와 같이 구현합니다.

let content = UNMutableNotificationContent()
content.title = "WARNING: LOW BLOOD SUGAR"
content.body = "Glucose level at 57."
content.categoryIdentifier = "low-glucose—alert"
content.sound = UNNotificationSound.criticalSoundNamed(@"warning-sound" withAudioVolume: 1.00)
{  
   "aps":{  
      "sound":{  
         "critical":1,
         "name":"warning-sound.aiff",
         "volume":1.0
      }
   }
}

 

이 글은 WWDC18 Session 710 What’s New in User Notifications을 요약한 글입니다. 글쓴이의 관심사가 아닌 일부 내용은 생략되어 있습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

*