[iOS | Swift] 앱 추적 권한 요청하기

Minji Kim·2022년 1월 14일
0

iOS | Swift

목록 보기
6/13
post-thumbnail

어느 순간부터 아이폰에서 새로운 앱을 설치한 후 실행하면 앱 추적 권한 창을 볼 수 있다. 이것을 왜 띄우는 건지, 어떻게 구현하는 건지 알아보자.

1. 앱 추적이 뭘까?

앱 추적 권한 요청 창에서 '허용'을 클릭하면 앱 내 광고를 사용자 맞춤형 광고로 제공할 수 있다.

예를 들어, 최근에 사용자가 '회색 후드티'에 대해서 조회했다면 앱 내에서 '회색 후드티'에 대한 광고를 보여준다.

사용자가 광고를 클릭할 확률이 올라가기 때문에 앱 추적을 사용하지 않을 때보다 수익을 올릴 수 있다.

IDFA와 AdSupport

여기서 알아야하는 개념이 IDFA(Identifier for Advertising)이다. 기기 ID 값인데, 사용자에게 맞춤형 광고를 제공할 때 사용되는 값이다.
애플에서 제공하는 AdSupport 프레임워크로 IDFA에 접근할 수 있다.

App Tracking Transparency

애플에서 제공하는 앱 추적 투명성(App Tracking Transparency) 프레임워크를 이용하여 사용자에게 앱 추적 권한을 요청할 수 있다.

2. 구현하기

info.plist

info.plist의 Privacy - Tracking Usage Description에 권한을 요청할 때 사용자에게 보여줄 문구를 입력한다.

AppDelegate

먼저, AdSupport와 AppTrackingTransparency를 import한다.

import AdSupport
import AppTrackingTransparency

그리고 두가지 경우로 나눌건데, 상황에 맞게 코드를 작성하면 될 것이다.

1) 앱 추적 권한만 요청하는 경우
2) 앱 추적외에 다른 권한도 요청하는 경우

  • 1) 앱 추적 권한만 요청하는 경우
    권한 요청 창을 바로 띄우지 않고 DispatchQueue.main.asyncAfter로 조금 늦게 띄워야 창이 제대로 나타난다.
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 앱 추적 권한 요청
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            if #available(iOS 14, *) {
                ATTrackingManager.requestTrackingAuthorization { status in
                    switch status {
                    case .authorized:           // 허용됨
                        print("Authorized")
                        print("IDFA = \(ASIdentifierManager.shared().advertisingIdentifier)")
                    case .denied:               // 거부됨
                        print("Denied")
                    case .notDetermined:        // 결정되지 않음
                        print("Not Determined")
                    case .restricted:           // 제한됨
                        print("Restricted")
                    @unknown default:           // 알려지지 않음
                        print("Unknow")
                    }
                }
            }
        }
        return true
    }
  • 2) 앱 추적외에 다른 권한도 요청하는 경우
    앱을 처음 설치하고 실행할 때 2가지 이상의 권한 요청 창을 띄우면 겹쳐서 한 개만 보여질 때가 있기 때문에 따로 setNotification() 메서드를 만들고 didFinishLaunchingWithOptions에서 호출할 것이다.
    DispatchQueue.main.asyncAfter를 이용해서 앞 권한 요청 창 보다 더 늦게 띄우는 것이다.
    (참고 : App Tracking Transparency Dialog does not appear on iOS)
  func setNotification(){
      let n = NotificationHandler()
      n.askNotificationPermission {
          // 다른 권한 요청 창보다 늦게 띄우기
          DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
              if #available(iOS 14, *) {
                  ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                      switch status {
                      case .authorized:		// 허용됨
                          print("Authorized")
                          print("IDFA = \(ASIdentifierManager.shared().advertisingIdentifier)")	// IDFA 접근
                      case .denied:		// 거부됨
                          print("Denied")
                      case .notDetermined:	// 결정되지 않음
                          print("Not Determined")
                      case .restricted:		// 제한됨
                          print("Restricted")
                      @unknown default:		// 알려지지 않음
                          print("Unknown")
                      }
                  })
              }
          }
      }
  }
  
  class NotificationHandler{
      //Permission function
      func askNotificationPermission(completion: @escaping ()->Void){
          //Permission to send notifications
          let center = UNUserNotificationCenter.current()
          // Request permission to display alerts and play sounds.
          center.requestAuthorization(options: [.alert, .badge, .sound])
          { (granted, error) in
              // Enable or disable features based on authorization.
              completion()
          }
      }
  }

didFinishLaunchingWithOptions 안에서 setNotification() 함수를 호출한다.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        setNotification()
        return true
}

결과

알림 권한 요청이 먼저 뜨고 나서 앱 추적 권한 요청이 나타난다.

💙 참고한 블로그 💙

https://velog.io/@khy226/swift-앱-추적-권한-띄우기
https://ios-development.tistory.com/462
https://www.androidhuman.com/2021-04-28-ios_att_explainer

profile
iOS Developer

0개의 댓글