-
[Objective-C] IDFA ์์ง์ ์ํ App Tracking Transparency ํ๋ ์์ํฌ ์ถ๊ฐ๐ iOS/๊ฐ๋ฐ 2023. 2. 5. 20:13
๐ IDFA
IDFA๋ Identifier for Advertising์ ์ฝ์๋ก, Apple์์ ์ฌ์ฉ์ ๊ธฐ๊ธฐ์ ํ ๋นํ ์์์ ์๋ณ์์ ๋๋ค. (Android์ ADID์ ์๋ฏธํ๋ ๋ฐ๊ฐ ๊ฐ์ ๊ฐ์ ๋๋ค.) ๊ด๊ณ ์ฃผ๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ง์ถคํ ๊ด๊ณ ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ธฐ์กด์๋ ์ด IDFA๊ฐ์ ๊ทธ๋ฅ ๊ฐ์ ธ์ฌ ์ ์์์ผ๋, iOS 14+๋ถํฐ๋ AppTrackingTransparency ํ๋ ์์ํฌ๋ฅผ ํตํด ์ฌ์ฉ์๋ก๋ถํฐ ์ถ์ ๊ถํ์ ๋ฐ์์์ผ IDFA๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ๋์์ต๋๋ค.
๐ App Tracking Transparency ํ๋ ์์ํฌ ์ถ๊ฐ
โ info.plist
NSUserTrackingUsageDescription ๊ถํ ์์ฒญ์ ์ค์ ํฉ๋๋ค.
โ ํ๋ก์ ํธ ํ์ผ > General > Frameworks, Libraries, and Embedded Content
AppTrackingTransparency ํ๋ ์์ํฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
โ ํ๋ก์ ํธ ํ์ผ > Build Phase > Link Binary With Libraries
AppTrackingTransparency ํ๋ ์์ํฌ์ Status๋ฅผ Optional๋ก ๋ณ๊ฒฝํฉ๋๋ค. iOS 14+ ํ๊ฒฝ์์๋ง ๋์์ํค๊ธฐ ์ํด์์ ๋๋ค.
๐ ์ฝ๋ ์์ฑ
#import <AppTrackingTransparency/AppTrackingTransparency.h> -(void)requestIDFA { if (@available(iOS 14, *)) { // ์ค์ > ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ๋ณด์ > ์ถ์ ์์ // Switch๊ฐ ON ์ํ์ผ ๋๋ง ๊ถํ์์ฒญ ํ์ ๋ ธ์ถ๋จ // Switch๊ฐ OFF ์ํ์ผ ๋๋ ๊ถํ์์ฒญ ํ์ ๋ ธ์ถ X, ์๋ denied๋ก ์ธํ ๋จ NSLog(@"ATT ์ถ์ ๊ถํ ์์ฒญ"); [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) { switch (status) { case ATTrackingManagerAuthorizationStatusAuthorized: NSLog(@"ATT ํ์ฉ"); break; case ATTrackingManagerAuthorizationStatusDenied: NSLog(@"ATT ๊ฑฐ๋ถ"); break; case ATTrackingManagerAuthorizationStatusRestricted: NSLog(@"ATT ์ ํ"); break; case ATTrackingManagerAuthorizationStatusNotDetermined: NSLog(@"ATT ๋ฏธ๊ฒฐ์ "); break; default: break; } }]; } }
requestTrackingAuthorizationWithCompletionHandler๋ฅผ ํตํด ์ฌ์ฉ์๋ก ํ์ฌ๊ธ ์ถ์ ๊ถํ์ ์์ฒญํ๋ ํ๋กฌํํธ๋ฅผ ๋์ฐ๊ณ , ์ฌ์ฉ์๊ฐ ์ ํํ ๊ฐ์ ๋ฐ๋ผ ํ์ํ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
๐ ์ฐธ๊ณ +์๊ธฐ ๊ถํ์์ฒญ ์ฝ๋๋ฅผ ์ค์ ํ์ฌ๋, ์ค์ - ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ๋ณด์ - ์ถ์ ์ '์ฑ์ด ์ถ์ ์ ์์ฒญํ๋๋ก ํ์ฉ' ์ค์์น๊ฐ ON ์ํ์ผ ๋๋ง ๊ถํ์์ฒญ ํ์ ์ด ๋ ธ์ถ๋ฉ๋๋ค. ๋ง์ฝ ์ด ์ค์์น๊ฐ ์ฌ์ง์ฒ๋ผ OFF ์ํ๋ผ๋ฉด ๊ถํ์์ฒญ ํ์ ์ด ๋ ธ์ถ๋์ง ์๊ณ ์๋์ผ๋ก ๊ถํ์์ฒญ์ด denied๋ก ์ธํ ๋ฉ๋๋ค.
๊ทธ๋ผ ์ด ์ค์์น์ ON/OFF ๊ฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋๊ฐ? > ํ์ฌ๋ก์๋ ์์ด๋ณด์ ๋๋ค.
๋ฐ๋ผ์ ํ์ด์ค๋ถ, ํธ์ํฐ, ๋ค์ด๋ฒ, ๋ฉ๋ก ๋ฑ ๋ง์ ์ฑ๋ค์ด ์ด ์ค์์น ๊ฐ์ด OFF์ผ ๋๋ ์ถ์ ๊ถํ ๊ด๋ จํด์๋ ์์ ์ฌ์ฉ์๊ฐ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์ฑ์ ์ด์ฉํ ์ ์๋๋ก ์๋ฌด๊ฒ๋ ๋์ฐ์ง ์์ผ๋ฉฐ, ON์ผ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋กฌํํธ๋ฅผ ๋์ฐ๊ณ ์์ต๋๋ค.
โ ์์ธ์ค๋ช ํ ๊ถํ์์ฒญ ํ๋กฌํํธ
ํธ์ํฐ, ๋ค์ด๋ฒ, ํ์ด์ค๋ถ ๋ฑ์ [๊ณ์ํ๊ธฐ] / [๋ค, ์ดํดํ์ต๋๋ค.] ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ถํ์์ฒญ ํ๋กฌํํธ๋ฅผ ๋์๋๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ ์ด๋ฐ ๊ตฌ์ฑ๋ฐฉ๋ฒ์ด ์ฌ์ฉ์์๊ฒ๋ ๊ฐ์ฅ ์น์ ํ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ถ์ ์ด๋ผ๋ ๋จ์ด ์์ฒด๊ฐ ์ฌ์ฉ์๊ฐ ๊บผ๋ฆฌ๊ธฐ ์ข์ ์ด๊ฐ์ด๋ผ, ์ต๋ํ ํ์ด์ ์ค๋ช ํด์ฃผ์ด์ผ ๊ฑฐ๋ถ๊ฐ์ ์กฐ๊ธ์ด๋๋ง ์ค์ผ ์ ์์ง ์์๊น ์ถ์ต๋๋ค.
โ ์์ธ์ค๋ช ๊ณผ ํจ๊ป ๊ถํ์์ฒญ ํ๋กฌํํธ
๋ค์์นดํ๋ ์์ธ์ค๋ช ๊ณผ ์ถ์ ๊ถํ ํ๋กฌํํธ๋ฅผ ํจ๊ป ๋์๋๋ค. ์ด๊ฒ๋ ์ค๋ช ์ฝ์ด๋ณด๋ฉด์ ๊ฒฐ์ ํ ์ ์๋ค๋ ๋ฉด์์ ์ข์ ๋ฐฉ๋ฒ์ธ ๋ฏ!
โ ์์ธ์ค๋ช ์์ด ๊ถํ์์ฒญ ํ๋กฌํํธ
๋ค์ด๋ฒ์นดํ, ์ฟ ํก, ํฐ๋น, ์จ์ด๋ธ, ์๋ธ๋ฆฌํ์ ๋ฑ์ ์ค๋ช ์์ด ์ถ์ ๊ถํ ํ๋กฌํํธ๋ง์ ๋์๋๋ค.
๐ ์ฐธ๊ณ ++
์์น๊ถํ์ด๋ ํธ์ฌ๊ถํ ๋ฑ ๋ค๋ฅธ ๊ถํ์ ํ๋กฌํํธ์ ์ด์ด์ ๋ฐ๋ก ์ถ์ ๊ถํ ํ๋กฌํํธ๋ฅผ ๋์ฐ๋ ค๋ฉด, ์ฌ์ฉ์๊ฐ ์ ํ ํ๋กฌํํธ์ ์๋ตํ ์ดํ ์คํ๋๋ ํธ๋ค๋ฌ์์ ์ถ์ ๊ถํ์์ฒญ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ฉ๋๋ค. ํ์ง๋ง ์ด ๋, ์ ์ด๋ 1์ด ์ด์์ ์๊ฐ ์ง์ฐ์ด ํ์ํฉ๋๋ค.
(์ฐธ๊ณ ๋งํฌ: https://developer.apple.com/forums/thread/690607)
๊ถํ ์์ฒญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๊ฐ ํ์ฑ์ํ(UIApplicationStateActive)์ธ ๊ฒฝ์ฐ์๋ง ํ๋กฌํํธ๋๋๋ฐ, Privacy ํ๋กฌํํธ๋ ํ๋ก์ธ์ค ์ธ์ ์ผ๋ก ํ์๋๋ฉฐ, ํ์๋ ๋ ์ผ์์ ์ผ๋ก ์ฑ์ ๋นํ์ฑ์ํ๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ๊ถํ ์์ฒญ์ด ์ฌ์ฉ์ ํ์ธ ๋ณด๋ฅ ์ค์ธ ๊ฒฝ์ฐ ๋ค๋ฐ๋ผ์ค๋ ๊ถํ ํ๋กฌํํธ๊ฐ ํ์๋์ง ์์ต๋๋ค.
(์ฐธ๊ณ ๋งํฌ: requestTrackingAuthorization ๊ณต์๋ฌธ์)์๋ฅผ ๋ค์ด ํธ์ฌ๊ถํ ํ๋กฌํํธ๊ฐ ๋จผ์ ํ์์ค์ผ ๋๋ ํ์ฑ์ํ์์๋ง ํ์๋๋ ์ถ์ ๊ถํ ํ๋กฌํฌํธ๊ฐ ํ์์กฐ์ฐจ ๋์ง ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
ํธ์ฌ๊ถํ ํ์ฉ์ฌ๋ถ ์ ํ์ ๋ง์น ํ ํ๋กฌํํธ๊ฐ ์ฌ๋ผ์ง๊ณ ๋นํ์ฑ์ํ์์ ๋ฒ์ด๋๊ธฐ๊น์ง์ ์๊ฐ์ ๋ฒ๊ธฐ ์ํด 1์ด ์ ๋์ ์๊ฐ ์ง์ฐ์ ์ฃผ๋ฉด ํํ ํ๋กฌํํธ๋ ์ ์ ํ์๋ฉ๋๋ค.
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error) { // ํธ์ฌ๊ถํ ํ์ฉ์ฌ๋ถ ์ ํ -> ์ถ์ ๊ถํ ํ์ฉ์ฌ๋ถ ์์ฐจ์ ํ์ ์ํด DispatchAfter๋ก 1์ด ์ง์ฐ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self requestIDFA]; }); } }
'๐ iOS > ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ