IDFA 관련 기록
IDFA 관련 간단한 기록!
iOS 14+ ) [충격 실화] IDFA를 사용하려면 사용자 동의 받아야..
글을 썼었는데..코드 위주로 다시 리캡
# IDFA 요청
iOS 14부터
import AdSupport
ASIdentifierManager.shared().advertisingIdentifier.uuidString
이렇게 IDFA를 가져올 수 있다.
아무것도 세팅안된 프로젝트에서 위 값을 출력해보면 설정 값에 상관없이
00000000-0000-0000-0000-000000000000
이 나온다.
# 권한 요청
먼저 info.plist에 NSUserTrackingUsageDescription를 추가해준다.
권한을 요청하는 코드는
위와 같다.
1. "앱이 추적을 요청하도록 허용"이 OFF
권한 요청 팝업 없이 바로 Denied로 끝난다.
(info.plist에 NSUserTrackingUsageDescription 추가안했다고 crash나는것도 X)
2. "앱이 추적을 요청하도록 허용"이 ON
권한요청 코드를 실행하면
위와같은 팝업이 뜬다.
이제부터 설명할 건
앱이 추적을 요청하도록 허용이 ON되어있기 때문에, 오른쪽과 같은 팝업이 뜬 상태라고 가정한다.
(다시 한 번 말하지만, 왼쪽이 OFF되어있으면 오른쪽 팝업이 뜨지도 않는다.)
# Case 1. 허용을 누른경우
authorized status가 나오며, 바로 IDFA를 얻을 수 있다.
ATTrackingManager.requestTrackingAuthorization { (status) in
switch status {
case .authorized:
print("authorized") ✅
print(ASIdentifierManager.shared().advertisingIdentifier.uuidString) // IDFA
case .denied:
print("denied")
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url, options: [:], completionHandler: nil)
case .notDetermined:
print("notDetermined")
case .restricted:
print("restricted")
}
}
# Case 2. 앱에 추적 금지 요청을 누른 경우.
1. Denied 상태로 떨어진다.
ATTrackingManager.requestTrackingAuthorization { (status) in
switch status {
case .authorized:
print("authorized")
case .denied:
print("denied") ✅
case .notDetermined:
print("notDetermined")
case .restricted:
print("restricted")
}
}
2. 설정에 내 앱이 OFF로 되어있다.
그 다음부터 requestTrackingAuthorization을 요청해도 Denied로 떨어지게 된다.
# Soultion For Case 2
Denied인 사용자에게 일단은 추적 허용에 대해서 ON을 받아야만한다.
ATTrackingManager.requestTrackingAuthorization { (status) in
switch status {
case .authorized:
print("authorized")
case .denied:
print("denied")
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url, options: [:], completionHandler: nil) ✅
case .notDetermined:
print("notDetermined")
case .restricted:
print("restricted")
}
}
이렇게 Setting으로 이동하도록 해준다.
(물론 이렇게 바로 Settings으로 이동하는건 안될 것 같지만;; 일단 예제니까!)
그러면
이렇게 Settings으로 이동하고, 추적허용을 ON / OFF 할 수 있게 된다.
1. 사용자가 다시 ON으로 안함 -> 방법 X
2. 사용자가 ON으로 변경 시도
바로 ON으로 퍅하고 바뀌는게 아니라
씨*** 또 물어본다. 처음 한번만 물어보는 것도 아니고 OFF -> ON할 때 마다 계속 물어본다.
2-1. 허용을 누르는 경우 -> ON으로 바뀐다. -> 다른 여타 권한 설정과 마찬가지로 앱으로 돌아가면 앱이 재시작.
2-2. 취소를 누르는 경우 -> OFF 유지.
3. 다시 앱으로 돌아와 권한 요청을 다시 하면
ATTrackingManager.requestTrackingAuthorization { (status) in
switch status {
case .authorized:
print("authorized") ✅
print(ASIdentifierManager.shared().advertisingIdentifier.uuidString) // IDFA
case .denied:
print("denied")
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url, options: [:], completionHandler: nil)
case .notDetermined:
print("notDetermined")
case .restricted:
print("restricted")
}
}
authorized status를 받게 되고, IDFA를 얻을 수 있게 된다.
# 참고
만약 위와같이 추적을 요청한 앱들이 모두 OFF 상태일 때 (중요)
&&
앱이 추적을 요청하도록 허용을 ON -> OFF로 바꾸는건 바로 된다.
하지만,
이렇게 하나라도 ON이 켜져있고 (IDFATest가 ON임)
&&
앱이 추적을 요청하도록 허용을 ON -> OFF로 시도하면
오른쪽 그림과 같이 한번 더 확인을 받게 된다.
"이전에 추적을 허용한 앱에 추적을 중단하도록 요청하겠습니까?"
1. 앱이 추적을 계속하도록 허용
"앱이 추적을 요청하도록 허용"이 OFF가 되고, 앱이 추적을 계속하도록 허용한 것이기 때문에 내가 ON했던 앱에 대해서는 ON이 유지된다.
즉, IDFATest앱에서는 authorized status를 얻게 되고, IDFA도 정상적으로 가져올 수 있다.
하지만,
1) 새롭게 TrackingAuthorization 권한 요청하는 앱
또는
2) 기존에 OFF되어있던 앱은 권한요청시 denied status가 나오게 된다.
1) 앱이 추적을 요청하도록 허용이 OFF되어있으므로
2) 기존에 OFF되어있었으므로 (ex. 위 사진에서 카카오톡)
2. 앱이 추적을 중단하도록 요청
"앱이 추적을 요청하도록 허용"이 OFF가 되고, 앱이 추적을 중단하도록 요청한거기 때문에, 이전에 ON되어있던 앱들이 OFF가 된다.
즉,
1 ) 새롭게 TrackingAuthorization 권한 요청하는 앱
또는
2 ) 기존에 ON되어있던 앱도 역시나 권한요청시 denied status가 나오게 된다. (OFF도 마찬가지)
1) 앱이 추적을 요청하도록 허용이 OFF되어있으므로
2) 앱이 추적을 중단하도록 요청한거기 때문에, 이전에 ON되어있던 앱들이 OFF가 되었으므로