Declaring Your Actionable Notification Types

Panther·2021년 8월 18일
0

https://developer.apple.com/documentation/usernotifications/declaring_your_actionable_notification_types

"Differentiate your notifications and add action buttons to the notification interface."

노티피케이션을 차별화하고 노티피케이션 인터페이스에 액션 버튼을 추가합니다.

Overview

액션 가능한 노티피케이션은 사용자가 상응하는 앱의 launch 없이도 전달된 노티피케이션에 응답할 수 있게 해줍니다. 다른 노티피케이션도 노티피케이션 인터페이스에서 정보를 표시하지만 사용자가 필요한 액션 경로는 앱을 launch하는 것 분입니다. 액션 가능한 노티피케이션의 경우 시스템은 하나 혹은 하나 이상의 버튼을 표시하고, 노티피케이션 인터페이스도 함께 보여줍니다. 버튼을 탭하는 것은 백그라운드에서 처리되는 선택된 액션을 앱에게 전송합니다.

Figure 1 Displaying the actions for a notification

액션 가능한 노티피케이션을 지원하려면 아래 내용을 충족시켜야 합니다.

  • launch 시점에 iOS 앱으로부터 하나 혹은 하나 이상의 노티피케이션 카테고리를 선언해야 합니다.
  • 노티피케이션 카테고리에 적합한 액션을 할당해야 합니다.
  • 등록한 모든 액션을 처리해야 합니다.
  • 노티피케이션 생성 시 노티피케이션 페이로드에 카테고리 아이덴티파이어를 할당해야 합니다.

Note
또한, 시스템은 노티피케이션 서비스 앱 확장 혹은 노티피케이션 컨텐트 앱 확장을 launch해야 하는지 여부를 결정하기 위해 카테고리를 사용합니다. 노티피케이션 앱 확장 생성에 대한 방법은 Modifying Content in Newly Delivered Notifications를 보시기 바랍니다. 노티피케이션 컨텐트 앱 확장 생성에 대한 방법은 Customizing the Appearance of Notifications를 보시기 바랍니다.

Modifying Content in Newly Delivered Notifications
https://developer.apple.com/documentation/usernotifications/modifying_content_in_newly_delivered_notifications
https://velog.io/@panther222128/Modifying-Content-in-Newly-Delivered-Notifications

Customizing the Appearance of Notifications.
<>

Declare Your Custom Actions and Notification Types

앱은 모든 액션을 처리해야 하기 때문에 launch 타임에 앱이 지원할 액션을 선언해줘야 합니다. 카테고리 및 액션 객체의 조합을 사용해서 액션을 선언할 수 있습니다. UNNotificationCategory 객체는 앱이 지원할 수 있는 노티피케이션의 타입을 정의하고 있고, UNNotificationAction 객체는 각 타입에 표시할 수 있는 버튼을 정의하고 있습니다. 예를 들어 미팅 초대를 위한 노티피케이션은 초대에 대한 허용 혹은 거절을 선택할 수 있는 버튼을 포함할 것입니다.

UNNotificationCategory 객체는 노티피케이션 타입의 노티피케이션을 처리하기 위한 방법에 대해 고유한 아이덴티파이어와 옵션을 갖습니다. 아이덴티파이어 속성에 있는 스트링은 카테고리 객체의 가장 중요한 부분입니다. 노티피케이션을 생성할 때 노티피케이션의 페이로드에 있는 스트링과 같은 스트링을 포함시켜야 합니다. 시스템은 상응하는 객체와 모든 액션을 위치시키기 위해 해당 스트링을 사용합니다.

액션을 노티피케이션 카테고리와 연결시키려면 하나 혹은 하나 이상의 UNNotificationAction 객체를 노티피케이션 카테고리에 할당해야 합니다. 각 액션 객체는 사용자에게 표시하기 위한 로컬화된 스트링을 포함하고 있고, 어떻게 액션을 처리하길 원하는지를 나타내는 옵션을 포함하고 있습니다. 예를 들어 설명으로써 액션을 태그하는 경우 시스템은 동작을 나타내기 위해 다른 강조를 표시할 것입니다.

Listing 1은 두 가지 액션을 갖는 커스텀 카테고리 등록 방법을 보여주고 있습니다. 제목 및 옵션과 더불어 각 액션은 고유한 아이덴티파이어를 갖고 있습니다. 사용자가 액션을 선택하면 시스템은 해당 아이덴티파이어를 앱에 전달합니다.

Listing 1 Registering actions and notification types

// Define the custom actions.
let acceptAction = UNNotificationAction(identifier: "ACCEPT_ACTION",
      title: "Accept", 
      options: UNNotificationActionOptions(rawValue: 0))
let declineAction = UNNotificationAction(identifier: "DECLINE_ACTION",
      title: "Decline", 
      options: UNNotificationActionOptions(rawValue: 0))
// Define the notification type
let meetingInviteCategory = 
      UNNotificationCategory(identifier: "MEETING_INVITATION",
      actions: [acceptAction, declineAction], 
      intentIdentifiers: [], 
      hiddenPreviewsBodyPlaceholder: "",
      options: .customDismissAction)
// Register the notification type.
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.setNotificationCategories([meetingInviteCategory])

Important
모든 액션 객체는 고유한 아이덴티파이어를 가지고 있어야 합니다. 액션을 처리할 때 아이덴티파이어는 하나의 액션과 다른 액션을 구분할 수 있는 유일한 방법이며, 이러한 액션이 다른 카테고리에 속하고 있어도 마찬가지입니다.

대부분의 액션은 사용자 선택의 결과를 나타내게 되지만, 텍스트 입력 액션은 사용자가 텍스트 기반 응답을 입력할 수 있도록 해줍니다. 그러면 앱은 사용자의 타입된 응답을 액션 처리에 통합할 수 있습니다. 예를 들어 메시지 앱은 받은 메시지에 대한 응답으로 입력된 텍스트를 보낼 수 있습니다. 텍스으 입력 액션을 생성하려면 UNNotificationAction 객체 대신 UNTextInputNotificationAction 객체를 생성해야 합니다. 사용자가 텍스트 입력 액션을 위한 버튼을 탭하면 시스템은 편집 가능한 텍스트 필드를 표시합니다. 액션이 앱에 전달되면 시스템은 사용자가 입력한 텍스트를 응답으로 포함시킵니다.

Include a Notification Category in the Payload

시스템은 페이로드가 유효한 카테고리 아이덴티파이어 스트링을 포함하는 노티피케이션만 액션을 표시합니다. 시스템은 앱의 등록된 카테고리 및 관련 액션을 찾기 위해 카테고리 아이덴티파이어를 사용합니다. 이후 시스템은 노티피케이션 인터페이스에 액션 버튼을 추가하기 위해 해당 정보를 사용합니다.

카테고리를 로컬 노티피케이션에 할당하려면 적합한 스트링을 UNMutableNotificationContent 객체의 categoryIdentifier 속성에 할당해야 합니다. Listing 2는 로컬 노티피케이션을 위한 컨텐트의 생성을 보여주고 있습니다. 기본적인 정보와 더불어 이 코드는 노티피케이션의 userInfo 딕셔너리에 커스텀 데이터도 추가하고 있습니다. userInfo 딕셔너리는 나중에 초대를 처리하기 위해 사용합니다.

Listing 2 Assigning a category to a local notification

let content = UNMutableNotificationContent()
content.title = "Weekly Staff Meeting"
content.body = "Every Tuesday at 2pm"
content.userInfo = ["MEETING_ID" : meetingID, 
                    "USER_ID" : userID ]
content.categoryIdentifier = "MEETING_INVITATION"

원격 노티피케이션에 카테고리 아이덴티파이어를 추가혀려면 Listing 3에서 보여주고 있는 것처럼 JSON 페이로드의 aps 딕셔너리에 카테고리 키를 포함시켜야 합니다. 이 키의 값을 적합한 카테고리 스트링으로 설정하시기 바랍니다. 예시에서 카테고리는 이전에 정의했었던 미팅 초대 카테고리와 같은 것으로 설정하고 있습니다. 로컬 노티피케이션 예시처럼 페이로드는 페이로드의 userInfo 딕셔너리에 넣을 미팅 ID와 사용자 ID와 함께 커스텀 키를 포함하고 있습니다. 앱은 초대를 허용하거나 거절하기 위해 해당 정보를 사용할 수 있습니다.

Listing 3 Assigning a category to a remote notification

{
   "aps" : {
      "category" : "MEETING_INVITATION"
      "alert" : {
         "title" : "Weekly Staff Meeting"
         "body" : "Every Tuesday at 2pm"
      },
   },
   "MEETING_ID" : "123456789",
   "USER_ID" : "ABCD1234"

}

Handle the Selected Action

앱은 정의하고 있는 모든 액션을 처리해야 합니다. 사용자가 액션을 선택하면 시스템은 백그라운드에서 앱을 launch하고, 공유된 UNUserNotificationCenter 객체(이 객체의 딜리게이트에 알려주는)를 알려줍니다. 선택된 액션을 식별하기 위해, 적합한 응답을 제공하기 위해 딜리게이트 객체의 userNotificationCenter(_:didReceive:withCompletionHandler:) 메소드를 사용하시기 바랍니다.

Listing 4는 미팅 초대를 관리하는 앱을 위한 딜리게이트 메소드의 구현을 보여주고 있습니다. 메소드는 주어진 초대에 대해 허용할지 거절할지를 결정하기 위한 응답으로 actionIdentifier 속성을 사용하고 있습니다. 노티피케이션 처리를 성공적으로 하기 위해 노티피케이션 페이로드로부터의 커스텀 데이터에도 의존하고 있습니다. 항상 액션 처리를 마무리한 후 컴플리션 핸들러를 호출하시기 바랍니다.

Listing 4 Performing a selected action

func userNotificationCenter(_ center: UNUserNotificationCenter,
       didReceive response: UNNotificationResponse,
       withCompletionHandler completionHandler: 
         @escaping () -> Void) {
       
   // Get the meeting ID from the original notification.
   let userInfo = response.notification.request.content.userInfo
   let meetingID = userInfo["MEETING_ID"] as! String
   let userID = userInfo["USER_ID"] as! String
        
   // Perform the task associated with the action.
   switch response.actionIdentifier {
   case "ACCEPT_ACTION":
      sharedMeetingManager.acceptMeeting(user: userID, 
                                    meetingID: meetingID)
      break
        
   case "DECLINE_ACTION":
      sharedMeetingManager.declineMeeting(user: userID, 
                                     meetingID: meetingID)
      break
        
   // Handle other actions…
 
   default:
      break
   }
    
   // Always call the completion handler when done.    
   completionHandler()
}

Important
액션에 대한 응답이 디스크에 있는 파일 접근과 관련이 있다면 다른 방식을 생각해야 합니다. 사용자는 앱에서 완전히 옵션 사용 불가능한 암호화된 파일 상태인, 기기가 잠겨있는 동안 액션에 응답할 수 있습니다. 이 경우 일시적으로 변경사항을 저장해야 하고, 이후에 앱의 데이터 구조에 통합시켜야 합니다.

See Also


Notification Categories and User Actions

UNNotificationCategory

앱이 지원할 수 있는 노티피케이션의 타입과 시스템이 표시할 수 있는 커스텀 액션입니다.

https://developer.apple.com/documentation/usernotifications/unnotificationcategory
https://velog.io/@panther222128/UNNotificationCategory

UNNotificationAction

앱이 시스템이 전달하는 노티피케이션에 대한 응답을 수행하는 작업입니다.

https://developer.apple.com/documentation/usernotifications/unnotificationaction
https://velog.io/@panther222128/UNNotificationAction

UNTextInputNotificationAction

사용자가 입력한 텍스트를 수용하는 액션입니다.

https://developer.apple.com/documentation/usernotifications/untextinputnotificationaction
https://velog.io/@panther222128/UNTextInputNotificationAction


0개의 댓글