/ IOS, APPTRACKINGTRANSPARENCY

iOS 14.5 - 좌충우돌 앱 추적 투명성(App Tracking Transparency) 적용기

iOS 14.5부터 앱 추적 투명성 (App Tracking Transparency) 프레임워크가 추가되면서, 사용자에게 명시적인 허가를 받아야만 기기의 기기의 광고 ID (IDFA; IDentifier for Advertising)에 접근할 수 있게 되었습니다.

광고 ID는 사용자에게 맞춤형 광고 (예: 최근에 조회한 상품의 연관 상품을 보여주는 등)를 제공할 때 필요한데요, 사용자가 클릭할 확률이 높기에 일반적인 광고보다 광고 단가가 높습니다. 따라서 광고 게시자(Publisher) 입장에서 더 높은 수익을 기대할 수 있습니다.

만약 광고 ID에 접근할 수 없다면, 더 이상 맞춤형 광고를 제공할 수 없습니다. 때문에 기존보다 낮은 단가의 광고를 받을 가능성이 높고, 광고 수익 하락으로 이어질 가능성이 매우 높습니다.

추적 권한 요청하기

앱 투명성 프레임워크를 사용하면 사용자에게 추적(Tracking) 권한을 요청할 수 있는데요, 사용자가 권한을 허용해야만 앱에서 광고 ID에 접근할 수 있게 됩니다.

추적 권한은 단 한번만 요청할 수 있는데요, 앱을 완전히 삭제하고 재설치하지 않는 한 다시 권한을 요청할 수 없습니다. 따라서 적절한 시점에, 권한이 필요한 상세한 이유를 사용자에게 충분히 제공한 다음 권한을 요청해야 합니다.

앱 투명성 프레임워크에서는 권한을 요청할 때 사용자에게 보여줄 문구를 지정할 수 있습니다. Info.plistNSUserTrackingUsageDescription 키 (Privacy - Tracking Usage Description)에 추적 권한이 필요한 이유를 기재하면 되는데요, 다음 스크린샷에서 보는 것처럼 권한 요청 다이얼로그에 문구가 표시되는 것을 확인할 수 있습니다.

권한 요청 다이얼로그를 보여주기 전에 권한이 필요한 이유를 자세히 설명하는 화면 (Explainer screen)을 활용할 수도 있습니다. 화면을 개발자가 원하는 대로 꾸밀 수 있으므로, 이를 적극적으로 활용하면 추적 허용 비율을 끌어올릴 수 있습니다. 다음은 커스텀 안내 화면을 구현한 사례입니다.

광고 네트워크별 SKAdNetworkIdentifier 추가하기

사용자가 추적을 허용하지 않는 경우, IDFA에 접근할 수 없기에 광고 네트워크에서 앱 설치와 같은 전환(conversion) 이벤트를 집계할 수 없습니다. 이를 보완하기 위해 애플에서는 광고 네트워크 별로 고유한 ID (SKAdNetworkIdentifier)를 부여하고, 이를 통해 각 네트워크가 전환 실적을 확인할 수 있도록 합니다.

네트워크에 따라 SkAdNetworkIdentifier를 추가하지 않는 앱에 광고를 서빙하지 않는 경우도 있으므로, 실적 하락을 방지하려면 반드시 추가해야 합니다.

SKAdNetworkIdentifierInfo.plistSKAdNetworkItems 항목에 추가하면 됩니다. 광고 네트워크별로 추가해야 하는 항목이 다르므로, 사용하는 광고 네트워크의 개발자 문서를 확인하는게 가장 정확합니다.

다음은 2021년 4월 28일 기준으로 구글 애드몹을 사용할 때 추가해야 하는 SKAdNetworkIdentifier 목록입니다.

<key>SKAdNetworkItems</key>
  <array>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>cstr6suwn9.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>4fzdc2evr5.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>2fnua5tdw4.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>ydx93a7ass.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>5a6flpkh64.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>p78axxw29g.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>v72qych5uu.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>c6k4g5qg8m.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>s39g8k73mm.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>3qy4746246.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>3sh42y64q3.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>f38h382jlk.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>hs6bdukanm.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>prcb7njmu6.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>wzmmz9fp6w.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>yclnxrl5pm.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>4468km3ulz.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>t38b2kh725.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>7ug5zh24hu.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>9rd848q2bz.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>n6fk4nfna4.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>kbd757ywx3.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>9t245vhmpl.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>2u9pt9hc89.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>8s468mfl3y.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>av6w8kgt66.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>klf5c3l5u5.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>ppxm28t8ap.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>424m5254lk.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>uw77j35x4d.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>e5fvkxwrpn.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>zq492l623r.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>3qcr597p9d.skadnetwork</string>
    </dict>
  </array>

사용자 안내 문구 작성하기

권한 요청 전 보여주는 안내 문구는 가급적 많은 사용자가 ‘추적 허용’을 선택하게 만들어야 합니다. 하지만, 너무 욕심을 부리면 앱스토어 심사 가이드라인을 위배하게 되므로 적절한 선(?!)을 지켜야 합니다. (작성자 본인 이야기…)

저도 욕심을 부리다가 두번 리젝을 먹었는데요, 어떤 표현을 사용할 수 있을지 고민하는 분들을 위해 제 사례를 공유합니다.

리젝 사례 1

App Store 심사 지침 3.2.2 (vi) 항을 위반하는 구현입니다. ‘다음 화면에서 ‘허용’ 을 선택’ 과 같이 직접적으로 사용자의 행동을 요구하는 문구를 사용할 수 없습니다.

더불어, ‘광고로 무료 앱을 후원하세요’ 문구도 ‘허용 버튼을 누르세요’ 문구와 함께 사용자의 특정 행동을 유도하는 문구라는 피드백을 받았습니다.

리젝 사례 2

안내 문구를 수정한 빌드입니다. 안내 문구에는 문제가 없지만, ‘다음에 결정’ 옵션 (권한 요청 다이얼로그를 표시하지 않고, 다음에 다시 앱을 실행했을 때 다시 한번 안내 화면을 띄우는 기능)이 App Store 심사 지침 5.1.1 (iv) 항을 위반합니다.

통과 사례

‘다음에 결정’ 옵션을 완전히 삭제한 구현입니다. 앱을 처음으로 실행했을 떄 안내 문구가 표시되고, ‘계속’ 버튼을 누르면 바로 권한 요청 다이얼로그를 띄워줍니다. 따라서, 이 시점 이후로는 더 이상 추적 권한을 요청할 수 없습니다.

정리

  • 추적을 허용하지 않은 사용자의 전환 실적을 측정할 수 있도록, Info.plist에 광고 네트워크별 SkAdNetworkIdentifier를 반드시 추가합니다.
  • 안내 문구에 직접적인 행동을 유도하는 문구(예: ‘허용’을 누르세요)를 사용하면 안됩니다.
  • 안내 화면 (Explainer screen) 및 권한 요청 다이얼로그는 단 한 번만 표시할 수 있습니다.
kunny

커니

안드로이드와 오픈소스, 코틀린(Kotlin)에 관심이 많습니다. 한국 GDG 안드로이드 운영자 및 GDE 안드로이드로 활동했으며, 현재 구글에서 애드몹 기술 지원을 담당하고 있습니다.

Read More