User Notifications

Groot·2022년 10월 10일
0

TIL

목록 보기
65/153
post-thumbnail
post-custom-banner

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 User Notifications - 공식문서

  • 서버에서 사용자 장치로 사용자 대면 알림을 푸시하거나 앱에서 로컬로 생성합니다.

📍 Overview

  • 사용자 대면 알림은 앱이 사용자의 기기에서 실행 중인지 여부에 관계없이 앱 사용자에게 중요한 정보를 전달합니다.
  • 예를 들어 스포츠 앱은 좋아하는 팀이 득점할 때 사용자에게 알릴 수 있습니다.
  • 알림은 또한 정보를 다운로드하고 인터페이스를 업데이트하도록 앱에 지시할 수 있습니다.
  • 알림은 경고를 표시하거나 소리를 재생하거나 앱 아이콘에 배지를 지정할 수 있습니다.
  • 앱에서 로컬로 알림을 생성하거나 관리하는 서버에서 원격으로 알림을 생성할 수 있습니다.
  • 원격 알림의 경우 회사 서버에서 푸시 알림을 생성하고 APN(Apple 푸시 알림 서비스)에서 해당 알림을 사용자의 기기로 전달합니다.
  • 이 프레임워크를 사용하여 다음을 수행합니다.
    • 앱이 지원하는 알림 유형을 정의합니다.
    • 알림 유형과 연결된 사용자 지정 작업을 정의합니다.
    • 배달을 위해 지역 알림을 예약합니다.
    • 이미 전달된 알림을 처리합니다. 사용자가 선택한 작업에 응답합니다.
  • 시스템은 적시에 로컬 및 원격 알림을 전달하기 위해 모든 시도를 하지만 전달이 보장되지는 않습니다.
  • PushKit 프레임워크는 VoIP 및 watchOS 컴플리케이션이 사용하는 특정 유형의 알림에 대해 보다 시기 적절한 전달 메커니즘을 제공합니다.
  • 자세한 내용은 푸시킷을 참조하십시오.

  • Safari 버전 16.0 이상의 웹 페이지의 경우 Safari 및 기타 브라우저에서 작동하는 푸시 API 코드를 사용하여 관리하는 서버에서 원격 알림을 생성하십시오.

    Siri는 귀하의 앱이 Notifications API를 통해 제공하는 온디바이스 정보를 사용하여 검색, 뉴스, Safari 및 기타 앱에서 사용자에게 제안을 제공할 수 있습니다.
    사용자는 앱에 대한 Siri 및 검색 설정을 통해 언제든지 허용하도록 이 기능을 변경할 수 있습니다.


📌 Scheduling a Notification Locally from Your App - 공식문서

  • 사용자의 관심을 끌고 싶을 때 앱에서 알림을 만들고 예약하세요.

📍 Overview

  • 로컬 알림을 사용하여 사용자의 관심을 끌 수 있습니다. 알림을 표시하거나 소리를 재생하거나 앱 아이콘에 배지를 지정할 수 있습니다.
  • 예를 들어 백그라운드 앱은 앱이 특정 작업을 완료할 때 경고를 표시하도록 시스템에 요청할 수 있습니다.
  • 항상 로컬 알림을 사용하여 사용자가 원하는 중요한 정보를 전달하세요.

  • 시스템은 사용자가 지정한 시간 또는 위치를 기반으로 알림 전달을 처리합니다.
  • 앱이 실행되고 있지 않거나 백그라운드에서 알림이 전달되면 시스템이 사용자와 상호 작용합니다.
  • 앱이 포그라운드에 있는 경우 시스템은 처리를 위해 앱에 알림을 전달합니다.

📍 Create the Notification's Content

  • 알림 세부 정보로 UNMutableNotificationContent 개체의 속성을 입력합니다.
  • 입력하는 필드는 시스템이 알림을 전달하는 방법을 정의합니다.
  • 예를 들어 사운드를 재생하려면 객체의 sound 속성에 값을 할당합니다.
  • 아래는 제목 문자열과 본문 텍스트가 포함된 경고를 표시하는 콘텐츠 개체를 보여줍니다.
  • 동일한 요청에서 여러 유형의 상호 작용을 지정할 수 있습니다.
    let content = UNMutableNotificationContent()
    content.title = "Weekly Staff Meeting"
    content.body = "Every Tuesday at 2pm"

📍 Specify the Conditions for Delivery

  • UNCalendarNotificationTrigger, UNTimeIntervalNotificationTrigger 또는 UNLocationNotificationTrigger 개체를 사용하여 알림을 전달하기 위한 조건을 지정합니다.

  • 각 트리거 개체에는 서로 다른 매개변수가 필요합니다.

  • 예를 들어 달력 기반 트리거를 사용하려면 배달 날짜와 시간을 지정해야 합니다.

  • 아래는 시스템이 매주 화요일 오후 2시에 알림을 전달하도록 구성하는 방법을 보여줍니다.

  • DateComponents 구조는 이벤트의 타이밍을 지정합니다.

  • repeats 매개변수를 true로 설정하여 트리거를 구성하면 시스템이 전달 후 이벤트를 다시 예약합니다.

    // Configure the recurring date.
    var dateComponents = DateComponents()
    dateComponents.calendar = Calendar.current
    
    dateComponents.weekday = 3  // Tuesday
    dateComponents.hour = 14    // 14:00 hours
    
    // Create the trigger as a repeating event.    
    let trigger = UNCalendarNotificationTrigger(
             dateMatching: dateComponents, repeats: true)

📍 Create and Register a Notification Request

  • 콘텐츠 및 트리거 조건을 포함하는 UNNotificationRequest 개체를 만들고 add(_:withCompletionHandler:) 메서드를 호출하여 시스템과 함께 요청을 예약합니다.

  • 아래는 위에서 설정한 내용을 사용하여 요청 객체를 채우는 예를 보여줍니다.

    // Create the request
    let uuidString = UUID().uuidString
    let request = UNNotificationRequest(identifier: uuidString, 
                content: content, trigger: trigger)
    
    // Schedule the request with the system.
    let notificationCenter = UNUserNotificationCenter.current()
    notificationCenter.add(request) { (error) in
       if error != nil {
          // Handle any errors.
       }
    }

📍 Cancel a Scheduled Notification Request

  • 예약된 알림 요청은 트리거 조건이 충족되거나 사용자가 명시적으로 취소할 때까지 활성 상태로 유지됩니다.
  • 일반적으로 조건이 변경되고 더 이상 사용자에게 알릴 필요가 없으면 요청을 취소합니다.
  • 예를 들어 사용자가 미리 알림을 완료하면 해당 미리 알림과 관련된 모든 활성 요청을 취소합니다.
  • 활성 알림 요청을 취소하려면 UNUserNotificationCenter의 removePendingNotificationRequests(withIdentifiers:) 메서드를 호출하세요.

  • 앱의 사용자 지정 작업 처리를 포함하여 시스템의 알림 인터페이스로 사용자 상호 작용에 응답합니다.

📍 Overview

  • 알림은 주로 사용자에게 정보를 제공하는 방법이지만 앱에서도 이에 응답할 수 있습니다.
  • 예를 들어 다음과 같이 응답할 수 있습니다.
    • 알림 인터페이스에서 사용자가 선택한 작업입니다.
    • 앱이 포그라운드에서 실행 중일 때 도착하는 알림입니다.
    • 자동 알림(앱에 백그라운드 업데이트 푸시 참조).
    • VoIP 또는 복잡한 관련 알림과 같은 PushKit 프레임워크와 연결된 알림입니다.

📍 Handle User-Selected Actions

  • 실행 가능한 알림을 통해 사용자는 알림 인터페이스에서 알림에 직접 응답할 수 있습니다.

  • 알림 내용 외에도 실행 가능한 알림은 사용자가 취할 수 있는 작업을 나타내는 하나 이상의 버튼을 표시합니다.

  • 버튼 중 하나를 탭하면 앱을 포그라운드로 가져오지 않고 선택한 작업이 앱으로 전달됩니다. 앱이 실행 가능한 알림 유형을 지원하는 경우 연결된 작업을 처리해야 합니다.

    >앱의 지원되는 카테고리를 선언하는 동시에 실행 가능한 알림 유형을 선언합니다. 자세한 내용은 실행 가능한 알림 유형 선언을 참조하십시오.

  • 공유 UNUserNotificationCenter 개체의 대리자 개체에서 선택한 작업을 처리합니다.

  • 사용자가 작업을 선택하면 시스템은 백그라운드에서 앱을 시작하고 대리자의 userNotificationCenter(_:didReceive:withCompletionHandler:) 메서드를 호출합니다.

  • 응답 개체의 actionIdentifier 속성 값을 앱의 작업 또는 시스템 정의 작업 중 하나와 일치시킵니다.

  • 시스템은 사용자가 알림을 닫거나 앱을 실행할 때 특별한 작업을 보고합니다.

  • Listing 1은 회의 초대와 관련된 작업을 처리하는 예를 보여줍니다.

  • ACCEPT_ACTION 및 DECLINE_ACTION 문자열은 회의 초대에 대한 적절한 응답을 생성하는 앱별 작업을 식별합니다.

  • 사용자가 앱 정의 작업 중 하나를 선택하지 않은 경우 메서드는 사용자가 앱을 시작할 때까지 초대를 저장합니다.

  • Listing 1 Handling the actions in your actionable notifications

    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
    
       if response.notification.request.content.categoryIdentifier ==
                  "MEETING_INVITATION" {
          // Retrieve the meeting details.
          let meetingID = userInfo["MEETING_ID"] as! String
          let userID = userInfo["USER_ID"] as! String
    
          switch response.actionIdentifier {
          case "ACCEPT_ACTION":
             sharedMeetingManager.acceptMeeting(user: userID, 
                   meetingID: meetingID)
             break
    
          case "DECLINE_ACTION":
             sharedMeetingManager.declineMeeting(user: userID, 
                   meetingID: meetingID)
             break
    
          case UNNotificationDefaultActionIdentifier,
               UNNotificationDismissActionIdentifier:
             // Queue meeting-related notifications for later
             //  if the user does not act.
             sharedMeetingManager.queueMeetingForDelivery(user: userID,
                   meetingID: meetingID)
             break
    
          default:
             break
          }
       }
       else {
          // Handle other notification types...
       }
    
       // Always call the completion handler when done.
       completionHandler()
    }

📍 Handle Notifications While Your App Runs in the Foreground

  • 앱이 포그라운드에서 실행 중일 때 알림이 도착하면 시스템은 해당 알림을 앱에 직접 전달합니다.

  • 알림을 받으면 알림의 페이로드를 사용하여 원하는 작업을 수행할 수 있습니다.

  • 예를 들어 알림에 포함된 새 정보를 반영하도록 앱 인터페이스를 업데이트할 수 있습니다.

  • 그런 다음 예약된 경고를 표시하지 않거나 해당 경고를 수정할 수 있습니다.

  • 알림이 도착하면 시스템은 UNUserNotificationCenter 개체의 대리자의 userNotificationCenter(_:willPresent:withCompletionHandler:) 메서드를 호출합니다.

  • 이 방법을 사용하여 알림을 처리하고 시스템에 원하는 진행 방식을 알립니다.

  • Listing 2 는 캘린더 앱에 대한 이 메소드의 버전을 보여줍니다.

  • 회의 초대장이 도착하면 앱은 사용자 지정 queueMeetingForDelivery 메서드를 호출하여 앱 인터페이스에 새 초대를 표시합니다.

  • 앱은 또한 사운드 값을 완료 핸들러에 전달하여 알림의 사운드를 재생하도록 시스템에 요청합니다.

  • 다른 알림 유형의 경우 이 메서드는 알림을 침묵시킵니다.

  • Listing 2 Processing notifications in the foreground

    ```swift
    func userNotificationCenter(_ center: UNUserNotificationCenter,
             willPresent notification: UNNotification,
             withCompletionHandler completionHandler: 
                @escaping (UNNotificationPresentationOptions) -> Void) {
       if notification.request.content.categoryIdentifier == 
                "MEETING_INVITATION" {
          // Retrieve the meeting details.
          let meetingID = notification.request.content.
                           userInfo["MEETING_ID"] as! String
          let userID = notification.request.content.
                           userInfo["USER_ID"] as! String
    
          // Add the meeting to the queue.
          sharedMeetingManager.queueMeetingForDelivery(user: userID,
                meetingID: meetingID)
    
          // Play a sound to let the user know about the invitation.
          completionHandler(.sound)
          return
       }
       else {
          // Handle other notification types...
       }
    
       // Don't alert the user for other types.
       completionHandler(UNNotificationPresentationOptions(rawValue: 0))
    }
    ```        

  • PushKit에 앱을 등록한 경우 PushKit 유형을 대상으로 하는 알림은 항상 앱에 직접 전달되며 사용자에게는 표시되지 않습니다.

  • 앱이 포그라운드 또는 백그라운드에 있는 경우 시스템은 앱에 알림을 처리할 시간을 줍니다.

  • 앱이 실행되고 있지 않은 경우 시스템은 알림을 처리할 수 있도록 백그라운드에서 앱을 실행합니다.

  • PushKit 알림을 보내려면 제공자 서버가 알림의 주제를 앱의 합병증과 같은 적절한 대상으로 설정해야 합니다.

  • PushKit 알림 등록에 대한 자세한 내용은 PushKit을 참조하십시오.

profile
I Am Groot
post-custom-banner

0개의 댓글