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

# 앱 삭제 트래킹 설정하기 - iOS SDK

에어브릿지는 앱 이벤트를 최근 6개월 동안 1번이라도 트래킹한 유저를 대상으로 사일런트 푸시를 매일 KST(한국표준시) 0시\~1시 사이에 보내서 앱 삭제 여부를 확인합니다. 앱 삭제 이벤트는 에어브릿지 리포트와 원본 데이터 추출 등으로 확인할 수 있습니다.

## 인증 정보 입력하기

애플 개발자 센터의 인증 정보를 에어브릿지 대시보드에 입력해야 합니다.

### 애플 개발자 대시보드에서 인증 정보 확인하기

애플 개발자 대시보드에서 아래 인증 정보 4가지를 확인해 주세요.

<AccordionGroup>
  <Accordion title="APNs 인증 키(p8) 및 Key ID">
    APNs 인증 키를 받기 위해서는 먼저 애플 개발자 센터에서 앱의 푸시 알람을 켜야 합니다.

    1. [애플 개발자 센터](https://developer.apple.com/account/resources)에서 \[Identifiers]를 클릭합니다.
    2. 앱 삭제를 트래킹하는 앱을 찾아 클릭합니다. 해당 앱에서 ‘Push Notification’을 체크해 주세요.
    3. [애플 개발자 센터](https://developer.apple.com/account/resources)에서 \[Keys]를 클릭합니다. ‘+’버튼을 클릭해 키를 새로 생성합니다. 그리고 APNs 인증 키(p8)를 다운로드합니다. APNs 인증 키는 최초로 키를 생성하는 과정에서만 다운로드할 수 있습니다. 다시 다운로드할 수 없습니다. 분실하면 다시 키를 발급받아야 합니다.

       한번에 생성할 수 있는 APNs 인증 키의 최대 개수는 2개입니다.
    4. \[Keys]에서 새로 생성한 키를 클릭하면 Key ID를 확인할 수 있습니다.
  </Accordion>

  <Accordion title="Bundle ID">
    [애플 개발자 센터](https://developer.apple.com/account/resources)에서 \[Certificates, Identifiers & Profiles]>\[Identifiers]를 클릭합니다. 사용하는 앱을 찾아 클릭합니다. 클릭한 앱의 Bundle ID를 확인할 수 있습니다.
  </Accordion>

  <Accordion title="Team ID (App ID Prefix)">
    [애플 개발자 센터](https://idmsa.apple.com/IDMSWebAuth/signin?appIdKey=891bd3417a7776362562d2197f89480a8547b108fd934911bcbea0110d07f757\&path=%2Faccount%2F\&rv=1#MembershipDetailsCard)의 \[Account]>\[Membership details]에서 Team ID (App ID Prefix)를 확인할 수 있습니다.
  </Accordion>
</AccordionGroup>

### 에어브릿지에 인증 정보 입력하기

에어브릿지의 \[설정]>\[앱 삭제 이벤트 트래킹]>\[iOS 앱 삭제 트래킹]에 애플 개발자 센터에서 한 인증 정보를 모두 입력합니다.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/WCTn-oGPmrNYnPbt/asset/image/ios-uninstall-apns-credentials-ko.png?fit=max&auto=format&n=WCTn-oGPmrNYnPbt&q=85&s=49b8db6d93d12e853f46177f328aad2e" alt="uninstall-ko-01-ios" width="1400" height="800" data-path="asset/image/ios-uninstall-apns-credentials-ko.png" />
</Frame>

#### 앱 환경 선택하기

인증 정보를 에어브릿지에 모두 입력한 이후에 푸시 토큰을 수집하는 앱 환경을 선택합니다.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/WCTn-oGPmrNYnPbt/asset/image/ios-uninstall-production-ko.png?fit=max&auto=format&n=WCTn-oGPmrNYnPbt&q=85&s=69d4091b3fc2f134c6dea777a028ed19" alt="uninstall-ko-02-ios" width="1400" height="800" data-path="asset/image/ios-uninstall-production-ko.png" />
</Frame>

선택하는 앱 환경에 따라 수집하는 푸시 토큰이 다릅니다. 예를 들어 Production 환경에서 수집한 푸시 토큰은 Development 환경에서 사용할 수 없습니다.

<AccordionGroup>
  <Accordion title="Production">
    * 지원 앱:  애플 앱 스토어에서 다운로드한 앱 또는 TestFlight, Ad Hoc, Enterprise 방법으로 배포한 테스트용 앱 등
    * 수집되는 푸시 포큰: 앱 삭제 트래킹에 실제로 사용하는 푸시 토큰
  </Accordion>

  <Accordion title="Development">
    * 지원 앱:  Production에서 지원하지 않는 개발용(테스트 목적의) 앱
    * 수집되는 푸시 토큰: 개발 환경에서 사용하는 푸시 토큰

    Development는 사일런트 푸시 테스트만 진행할 수 있습니다. 앱 삭제를 실제로 트래킹하기 위해서는 Production에서 진행해 주세요.
  </Accordion>
</AccordionGroup>

### 사일런트 푸시 테스트하기

사일런트 푸시 테스트는 사일런트 푸시가 정상적으로 전송되는지 확인할 수 있는 테스트입니다. ‘사일런트 푸시 테스트’를 클릭하면 입력한 인증 정보로 사일런트 푸시를 디바이스에 정상적으로 전송하는지 확인할 수 있습니다. 사일런트 푸시 테스트는 앱 삭제 이벤트를 측정하거나 생성하지 않기 때문에 에어브릿지 대시보드에서 앱 삭제를 확인할 수 없습니다.

앱 삭제 트래킹을 위해 필요한 인증 정보 중 하나인 Bundle ID는 사일런트 푸시 테스트로만 유효성을 검증할 수 있습니다. 따라서 사일런트 푸시 테스트 진행을 권장합니다.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/WCTn-oGPmrNYnPbt/asset/image/ios-uninstall-silent-push-ko.png?fit=max&auto=format&n=WCTn-oGPmrNYnPbt&q=85&s=87ac11895d90d01a7285e82d7f71eb2b" alt="uninstall-ko-04-ios" width="1400" height="800" data-path="asset/image/ios-uninstall-silent-push-ko.png" />
</Frame>

사일런트 푸시 테스트를 진행하기 위해서는 APNs 푸시 토큰(디바이스 토큰)이 필요합니다. 앱 환경에 따라 수집하는 푸시 토큰이 다릅니다. 사일런트 푸시 테스트를 진행하기 전에 푸시 토큰과 앱 환경을 확인해야 합니다. APNs 푸시 토큰을 확인하는 방법은 [애플 개발자 가이드](https://developer.apple.com/documentation/usernotifications/registering_your_app_with_apns)를 참고해 주세요.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/WCTn-oGPmrNYnPbt/asset/image/ios-silent-push-test-token-ko.png?fit=max&auto=format&n=WCTn-oGPmrNYnPbt&q=85&s=253396488dc6f42f68fbc2de6c388837" alt="uninstall-ko-05-ios" width="1400" height="800" data-path="asset/image/ios-silent-push-test-token-ko.png" />
</Frame>

에어브릿지에서 디바이스로 사일런트 푸시를 전송하면 성공 메시지 또는 에러 코드를 확인할 수 있습니다. iOS 환경의 사일런트 푸시 테스트로 확인할 수 있는 주요 에러 코드는 아래와 같습니다. 에러 코드에 관한 자세한 내용은 [애플 개발자 가이드](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/handling_notification_responses_from_apns#3394541)를 참고해 주세요.

<Accordion title="주요 에러 코드 - 사일런트 푸시 테스트">
  | 에러 코드                          | 의미                                                                         |
  | ------------------------------ | -------------------------------------------------------------------------- |
  | **403 (InvalidProviderToken)** | 잘못된 APNs 인증 정보입니다. 올바른 Key ID 혹은 Team ID를 입력한 후 다시 시도해주세요.                 |
  | **400 (TopicDisallowed)**      | 잘못된 Bundle ID입니다. 인증 정보 입력란으로 돌아가 올바른 Bundle ID를 입력한 후 다시 시도해 주세요.         |
  | **400 (BadDeviceToken)**       | 잘못된 푸시 토큰입니다. 테스트 앱과 앱 환경 설정이 일치하는지 확인해 보세요.                               |
  | **410 (Unregistered)**         | 잘못된 푸시 토큰입니다. 테스트 앱과 앱 환경 설정이 일치하는지 확인해 보세요. 또는 수일 전에 사용자가 앱을 삭제했을 수 있습니다. |
  | **410 (ExpiredToken)**         | 잘못된 푸시 토큰입니다. 테스트 앱과 앱 환경 설정이 일치하는지 확인해 보세요. 또는 수일 전에 사용자가 앱을 삭제했을 수 있습니다. |

  이미 앱이 삭제됐다는 의미를 가진 일부 에러 코드는 사일런트 푸시가 앱 삭제 이벤트를 정상적으로 트래킹해도 나올 수 있습니다. 하지만 사일런트 푸시 테스트의 목적은 사일런트 푸시가 정상적으로 전송되는 확인하는 것에 있습니다.

  트래킹하는 앱을 최근 10일 동안 삭제하지 않은 테스트 디바이스로 사일런트 푸시 테스트를 진행해 주세요.
</Accordion>

<Danger>
  **주의하세요**

  iOS 시뮬레이터(iOS Simulator)에서는 사일런트 푸시 테스트를 진행할 수 없습니다.
</Danger>

## 에어브릿지 SDK 설정하기

iOS 환경에서 발생한 앱 삭제를 트래킹하기 위해서는 앱에서 사일런트 푸시 알람이 동작되도록 식별자(identifier)를 설정하고 Capabilities를 추가해야 합니다. 또 앱이 앱 삭제 트래킹 목적의 사일런트 푸시 알람을 무시하는 코드를 추가해야 합니다.

### Capabilities 활성화하기

1. Xcode에서 \[Project 파일]>\[Signing & Capabilities]로 이동합니다.
2. '+ Capability'을 클릭합니다. Push Notifications도 선택해 주세요. 그리고 Background Modes를 선택한 후에 Remote Notification을 체크합니다.

### 푸시 알람 설정하기

`registerForRemoteNotifications` 함수를 호출하면 앱에서 푸시 알람을 사용할 수 있습니다. 푸시 알람을 기존에 사용하지 않았다면 해당 함수를 호출해 주세요.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ application: UIApplication,
                   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool
  {
      ...
      UIApplication.shared.registerForRemoteNotifications()
      ...
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      [UIApplication.sharedApplication registerForRemoteNotifications];
      return YES;
  }
  ```
</CodeGroup>

설정 이후에는 사일런트 푸시 알람을 포함한 푸시 알람이 전송될 때마다 `application(_:didFinishLaunchingWithOptions:)` 함수가 항상 호출됩니다. 사일런트 푸시 알람이 전송되면 앱이 백그라운드(Background)로 실행된 이후에 해당 함수가 호출됩니다. 이미 앱이 백그라운드로 실행된 상태이기 때문에 앱이 포어그라운드(Foreground)로 변경되더라도 함수가 다시 호출되지 않습니다.

`application(_:didFinishLaunchingWithOptions:)` 함수 호출 여부는 `launchOption`으로 확인할 수 있습니다. 아래 코드를 참고해 주세요.

```swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
    let key = UIApplication.LaunchOptionsKey.remoteNotification
    let isLaunchRemoteNotification: Bool = launchOptions?[key] != nil
}
```

### APNs Push Token 전송하기

APNs Push Token 이 생성되면 해당 토큰을 `registerPushToken` 함수를 호출해 SDK에 전달해 주세요.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ application: UIApplication,
                   didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
  {
      AirBridge.registerPushToken(deviceToken)
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
      [AirBridge registerPushToken:deviceToken];
  }
  ```
</CodeGroup>

### 에어브릿지 사일런트 푸시 알람 무시 설정하기

에어브릿지가 앱 삭제 트래킹을 위해 보내는 사일런트 푸시 알람은 유저 앱에 나오지 않아야 하는 알람입니다. 앱은 해당 푸시 알람을 무시해야 합니다. 아래 코드를 참고해 주세요.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ application: UIApplication,
                   didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
  {
      if Airbridge.isUninstallTrackingNotification(userInfo) {
          return
      }
    
      ...
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
      if ([Airbridge isUninstallTrackingNotification:userInfo]) {
          return;
      }
      ...
  }
  ```
</CodeGroup>

## 앱 삭제 트래킹 시작하기

에어브릿지 대시보드에 인증 정보를 입력하고 에어브릿지 SDK 설정을 마치면 앱 삭제 트래킹 토글을 활성화할 수 있습니다. 토글을 활성화하면 앱 삭제 트래킹이 시작됩니다.

앱 삭제에 관한 자세한 내용은 [에어브릿지 가이드](/ko/guides/uninstall-event-tracking)에서 확인해 주세요.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/WCTn-oGPmrNYnPbt/asset/image/ios-uninstall-tracking-toggle-ko.png?fit=max&auto=format&n=WCTn-oGPmrNYnPbt&q=85&s=bfa81e46b8a098e1296fb77fa87fa5fc" alt="uninstall-ko-03-ios" width="1400" height="800" data-path="asset/image/ios-uninstall-tracking-toggle-ko.png" />
</Frame>

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/uninstall-tracking-ios-sdk-v4" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/uninstall-tracking-ios-sdk-v4" />
