> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 확인된 전달

> 확인된 전달은 OneSignal을 통해 전송된 푸시 알림을 기기가 받은 시점을 추적합니다. iOS, Android, Huawei, Web의 요구 사항, 플랫폼 제한 사항 및 문제 해결을 다룹니다.

## 개요

확인된 전달은 기기가 OneSignal을 통해 전송된 푸시 알림을 실제로 **수신**한 시기를 추적합니다. 기기의 OneSignal SDK가 푸시를 수신하면, 알림 ID와 기기의 [구독 ID](./subscriptions)를 포함한 확인 이벤트를 OneSignal로 다시 보냅니다. 이를 통해 어떤 구독이 어떤 알림을 받았는지 정확히 확인할 수 있습니다.

OneSignal 대시보드에서 확인된 전달은 [메시지 보고서](./push-notification-message-reports)에 **확인됨** (또는 **수신됨**)으로 표시됩니다. 모든 전달 및 참여 지표에 대해서는 [지표 용어집](./analytics-metrics-glossary)을 참조하세요.

<Frame caption="확인된 전달 흐름">
  <img src="https://mintcdn.com/onesignal/_KaXe4GQkxsEfa17/images/docs/35ba167-analytics-ensure-confirmed-message-delivery_1.png?fit=max&auto=format&n=_KaXe4GQkxsEfa17&q=85&s=17ce8f50b8e92e0d368abe42865709c3" alt="확인된 전달 흐름" width="800" height="667" data-path="images/docs/35ba167-analytics-ensure-confirmed-message-delivery_1.png" />
</Frame>

<Note>
  확인된 전달은 "전달됨"과 다릅니다. 플랫폼 푸시 서비스(APNs, FCM, ADM, HMS)는 알림이 서비스에 의해 수락되었는지 여부를 보고합니다 — 기기가 실제로 받았는지가 아닙니다. 확인된 전달은 기기 측의 확인입니다.
</Note>

***

## 요구 사항

* **유료 플랜**에서만 사용할 수 있습니다. [플랜 비교](https://onesignal.com/pricing).
* [Web SDK 설정](./web-sdk-setup) 및/또는 [모바일 SDK 설정](./mobile-sdk-setup)을 완료하세요.
  * 확인된 전달은 기기에 OneSignal SDK가 설치된 경우에만 작동합니다.
  * API만 통해 생성된 구독은 **지원되지 않습니다**.

### 플랫폼별 제한 사항

**iOS**

* **알림 서비스 확장** 및 **앱 그룹** 설정이 모두 필요합니다.
* APNs는 오프라인일 때 **앱당 하나의 메시지**만 유지합니다. 오프라인 상태에서 여러 푸시가 전송되면 최신 푸시만 전달됩니다.

**Huawei**

* `data` [Huawei 메시지 유형](/reference/push-notification#body-huawei-msg-type)에만 지원됩니다.
* `message` 유형의 경우 Huawei는 자체 대시보드에서만 수신 데이터를 제공합니다.

**Web**

* Safari는 확인된 전달을 **지원하지 않습니다**.

***

## 확인된 전달 문제 해결

푸시 알림을 전혀 받지 못하는 경우 먼저 [알림이 표시되지 않음](./notifications-show-successful-but-are-not-being-shown)을 참조하세요.

### iOS

iOS에서 확인된 전달은 두 가지가 함께 작동해야 합니다:

1. 푸시가 도착했을 때 OneSignal 코드를 실행하는 **Notification Service Extension** (NSE)
2. 메인 앱 타겟과 NSE 타겟 간에 데이터를 교환할 수 있도록 공유되는 **App Group**

둘 중 하나가 누락되거나 잘못 설정된 경우, 기기는 푸시를 수신하지만 OneSignal에 보고하지 않습니다.

**iOS 설정 확인**

<Steps>
  <Step title="NSE 타겟이 존재하고 올바른 코드를 가지고 있는지 확인">
    Xcode에서 프로젝트 타겟 아래에 **OneSignalNotificationServiceExtension** 타겟이 나열되어 있는지 확인하세요. 존재하지 않으면 [iOS SDK 설정의 2단계](./ios-sdk-setup#step-2-add-a-notification-service-extension-nse)를 따르세요.

    NSE의 `NotificationService.swift` (또는 `.m`) 파일을 여세요. `didReceive(_:withContentHandler:)` 내에서 `OneSignalExtension.didReceiveNotificationExtensionRequest`를 호출해야 합니다. 파일에 아직 Apple의 기본 템플릿 코드가 포함되어 있으면 [OneSignal NSE 코드](./ios-sdk-setup#step-2-add-a-notification-service-extension-nse)로 교체하세요.
  </Step>

  <Step title="NSE에 OneSignalExtension 패키지가 있는지 확인">
    **NSE 타겟 > General > Frameworks and Libraries** (또는 **Build Phases > Link Binary With Libraries**)를 선택하세요. `OneSignalExtension`이 나열되어 있는지 확인하세요. 메인 앱 타겟은 `OneSignalFramework`를 사용하지만, NSE 타겟은 `OneSignalExtension`을 사용해야 합니다 — 이들은 서로 다른 패키지입니다.
  </Step>

  <Step title="App Group이 두 타겟 모두에서 올바르게 설정되어 있는지 확인">
    OneSignal SDK는 App Group을 사용하여 메인 앱과 NSE 간에 데이터를 공유합니다. 두 가지 설정 방법이 있습니다 — 설정에 맞는 것을 선택하세요.

    1. **메인 앱 타겟 > Signing & Capabilities > App Groups**를 선택합니다.
    2. App Group을 확인합니다.

    App Group이 `group.YOUR_MAIN_APP_BUNDLE_ID.onesignal`(**YOUR\_MAIN\_APP\_BUNDLE\_ID**는 **General > Identity**에서 확인할 수 있는 메인 앱 타겟의 번들 식별자)인 경우 기본 App Group 탭을 따르세요. 그렇지 않으면 사용자 지정 App Group 탭을 따르세요.

    <Tabs>
      <Tab title="기본 App Group - group.YOUR_MAIN_APP_BUNDLE_ID.onesignal">
        1. **NSE 타겟 > Signing & Capabilities > App Groups**를 선택합니다.
        2. **동일한** App Group이 나열되어 있는지 확인합니다. 없으면 **+ Capability > App Groups**를 통해 추가하고 동일한 그룹을 선택합니다.

        흔한 실수는 메인 앱의 번들 식별자 대신 NSE의 번들 식별자를 사용하는 것입니다:

        * **올바름:** `group.YOUR_MAIN_APP_BUNDLE_ID.onesignal`
        * **잘못됨:** `group.YOUR_MAIN_APP_BUNDLE_ID.OneSignalNotificationServiceExtension.onesignal`

        메인 앱 타겟과 NSE 타겟은 동일한 App Group 식별자를 가져야 합니다.
      </Tab>

      <Tab title="사용자 지정 App Group">
        App Group 식별자가 `group.YOUR_MAIN_APP_BUNDLE_ID.onesignal` 형식을 따르지 않는 경우 이 옵션을 사용하세요.

        1. **메인 앱 타겟 > Signing & Capabilities > App Groups**를 선택합니다.
        2. 사용자 지정 App Group이 나열되어 있는지 확인합니다.
        3. 메인 앱 타겟의 `Info.plist`를 선택하고 다음 키를 추가합니다:

        ```xml theme={null}
        <key>OneSignal_app_groups_key</key>
        <string>group.your-custom-group-name</string>
        ```

        `group.your-custom-group-name`을 실제 App Group 이름으로 교체하세요.

        4. **NSE 타겟 > Signing & Capabilities > App Groups**를 선택합니다.
        5. **동일한** 사용자 지정 App Group이 나열되어 있는지 확인합니다. 없으면 **+ Capability > App Groups**를 통해 추가하고 동일한 그룹을 선택합니다.
        6. NSE 타겟의 `Info.plist`를 선택하고 다음 키를 추가합니다:

        ```xml theme={null}
        <key>OneSignal_app_groups_key</key>
        <string>group.your-custom-group-name</string>
        ```

        `group.your-custom-group-name`을 실제 App Group 이름으로 교체하세요.

        메인 앱 타겟과 NSE 타겟은 동일한 App Group 식별자를 가져야 합니다.
      </Tab>
    </Tabs>

    <Warning>
      빌드 설정에 `.xcconfig` 파일을 사용하는 경우 App Group이 해당 파일에서 재정의되거나 생략되지 않는지 확인하세요.
    </Warning>
  </Step>

  <Step title="최소 배포 타겟이 일치하는지 확인">
    **NSE 타겟 > General > Minimum Deployments**를 선택합니다. 이 값은 메인 앱 타겟의 최소 배포와 일치해야 합니다. 불일치하면 특정 OS 버전에서 NSE가 실행되지 않을 수 있습니다.
  </Step>

  <Step title="&#x22;Copy only when installing&#x22; 체크 해제">
    **메인 앱 타겟 > Build Phases > Embed App Extensions**를 선택합니다. **"Copy only when installing"이 체크 해제**되어 있는지 확인합니다. 체크되어 있으면 NSE가 개발 빌드 중에 포함되지 않아 테스트 시 실행되지 않습니다.
  </Step>

  <Step title="Info.plist의 NSExtension 값 확인">
    **NSE 타겟 > Info 탭**을 선택하고 `NSExtension` 키를 확장합니다. 다음이 포함되어 있는지 확인하세요:

    ```xml theme={null}
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.usernotifications.service</string>
    <key>NSExtensionPrincipalClass</key>
    <string>$(PRODUCT_MODULE_NAME).NotificationService</string>
    ```

    NSE가 Objective-C로 작성된 경우 `$(PRODUCT_MODULE_NAME).NotificationService` 대신 `NotificationService`를 사용하세요.
  </Step>

  <Step title="mutable-content가 설정되어 있는지 확인">
    OneSignal은 푸시 페이로드에 자동으로 `mutable-content: 1`을 설정하여 iOS가 NSE를 호출하도록 지시합니다. [REST API](/reference/push-notification)를 통해 푸시를 보내는 경우 `mutable_content: false`를 명시적으로 설정하지 않았는지 확인하세요. `mutable-content` 없이는 iOS가 NSE를 실행하지 않아 확인된 전달이 트리거될 수 없습니다.
  </Step>

  <Step title="NSE가 실행되고 있는지 테스트">
    OneSignal 호출 전 `didReceive` 내에 이 줄을 임시로 추가합니다:

    ```swift theme={null}
    bestAttemptContent.body = "[Modified] " + bestAttemptContent.body
    ```

    자신에게 테스트 푸시를 보냅니다. 알림 본문이 `[Modified]`로 시작하면 NSE가 올바르게 실행되고 있습니다. 그렇지 않으면 위 단계를 다시 확인하세요 — NSE가 호출되지 않고 있습니다. 테스트 후 이 줄을 제거하세요.

    Xcode Console 로그를 사용한 고급 NSE 디버깅에 대해서는 [iOS Notification Service Extension 디버깅](./service-extensions#debugging-the-ios-notification-service-extension)을 참조하세요.
  </Step>
</Steps>

### Android

* 알림이 표시되지 않는 경우: [모바일 푸시 문제 해결](./notifications-show-successful-but-are-not-being-shown)을 참조하세요.
* 알림은 표시되지만 확인된 전달이 누락된 경우: 사용자 지정 Android 서비스 확장이 차단하고 있을 수 있습니다. [Android 서비스 확장 가이드](./service-extensions#android-service-extension)를 확인하세요.

### Web

* Safari는 지원되지 않습니다.
* 다른 브라우저의 경우 **v16 SDK**로의 마이그레이션이 완료되었는지 확인하세요:
  * 올바른 SDK 초기화:
    ```html theme={null}
    <script src="https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js" defer></script>
    ```
  * 올바른 Service Worker 참조:
    ```html theme={null}
    importScripts("https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.sw.js");
    ```

***

## FAQ

### 확인된 전달 수치가 낮거나 누락된 이유는 무엇인가요?

가장 일반적인 원인은 설정 문제(특히 iOS), 비활성 기기, 플랫폼 제한 사항입니다.

1. **iOS 잘못된 구성:** 알림 서비스 확장 또는 App Group이 누락되었거나 올바르지 않습니다. 위의 [iOS 확인된 전달 문제 해결](#ios)을 참조하세요.
2. **비활성 또는 버려진 기기:** 오프라인이거나 더 이상 사용되지 않는 기기는 푸시를 수신하거나 확인된 전달 이벤트를 보내지 않습니다. 아래의 [비활성 기기를 어떻게 처리하나요?](#비활성-기기를-어떻게-처리하나요)를 참조하세요.
3. **플랫폼 제한 사항:** Huawei `message` 유형과 Safari는 확인된 전달을 지원하지 않습니다.
4. **Android 강제 종료:** 일부 기기 제조업체는 앱을 스와이프하여 닫는 것을 강제 종료로 처리하여 SDK 이벤트가 중지됩니다. [모바일 푸시 표시되지 않음 가이드](./notifications-show-successful-but-are-not-being-shown)를 참조하세요.

### 비활성 기기를 어떻게 처리하나요?

오프라인이거나 버려진 기기는 푸시 알림을 수신하거나 확인된 전달 이벤트를 보내지 않습니다. 이는 사용자가 기기를 교체하거나 버릴 때 일반적입니다.

비활성 사용자를 다시 참여시키려면:

* **Audience Activity**를 사용하여 전달을 확인하지 않은 사용자에게 다시 보내세요.
* **Last Session**을 기반으로 [세그먼트](./segmentation)를 만드세요 (예: 90일 이상 비활성).
  * [재참여 Journey](./journeys-examples#re-engagement-campaign)와 결합하여 되찾아 오세요.
  * 정기적으로 비활성 사용자를 타겟팅하여 연결할 수 없는 기기를 정리하세요.

OneSignal이 구독 상태를 업데이트하는 방법에 대한 자세한 내용은 [푸시 구독 상태는 언제 업데이트되나요?](./subscriptions#when-do-push-subscription-statuses-update)를 참조하세요.

### 확인됨으로 표시되지만 내 기기에 나타나지 않는 이유는 무엇인가요?

확인된 전달 이벤트는 기기가 푸시 페이로드를 수신했음을 의미합니다. 드물게 알림이 표시되지 않을 수 있습니다.

가능한 원인:

* **알림 놓침:** [테스트 구독 찾기 및 설정](./test-users)을 통해 자신에게 테스트 푸시를 보내 확인하세요.
* **iOS 집중 모드:** "방해 금지", "수면" 또는 기타 [집중 모드](./ios-focus-modes-and-interruption-levels)는 알림을 지연하거나 그룹화합니다. 그룹화된 알림을 보지 않고 닫았을 수 있습니다.
* **표시를 억제하는 앱 코드:**
  * [포그라운드 라이프사이클 리스너](./mobile-sdk-reference#addforegroundlifecyclelistener-push) 또는 [Notification Service Extension](./service-extensions)의 `event.preventDefault()`는 알림 표시를 중지합니다.
  * [`removeDeliveredNotifications(withIdentifiers:)`](https://developer.apple.com/documentation/usernotifications/unusernotificationcenter/removedeliverednotifications\(withidentifiers:\)) 또는 [`removeAllDeliveredNotifications()`](https://developer.apple.com/documentation/usernotifications/unusernotificationcenter/removealldeliverednotifications\(\)) 호출은 알림이 도착한 후 제거합니다.
* **푸시 페이로드 설정:**
  * `priority`가 높음으로 설정되어 있는지 확인하세요. [푸시 우선순위](./push#priority)를 참조하세요.
  * [`collapse_id`](./push#collapse_id)는 동일한 ID를 사용하여 이전 푸시를 새 푸시로 교체합니다.

***

<Info>
  도움이 필요하신가요?

  지원 팀과 채팅하거나 `support@onesignal.com`으로 이메일을 보내주세요.

  다음을 포함해 주세요:

  * 발생한 문제의 세부 정보 및 재현 단계(가능한 경우)
  * OneSignal 앱 ID
  * External ID 또는 Subscription ID(해당하는 경우)
  * OneSignal 대시보드에서 테스트한 메시지의 URL(해당하는 경우)
  * 관련 [로그 또는 오류 메시지](/docs/ko/capturing-a-debug-log)

  기꺼이 도와드리겠습니다!
</Info>
