Preparing your app for iOS 14 - adxcorp/ADXLibrary_Integration GitHub Wiki

IDFA (Identifier for Advertisers)

  • iOS 13 ์ด์ „์—๋Š” '๊ด‘๊ณ  ์ถ”์  ์ œํ•œ (Limit Ad Tracking)'์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ „์—๋Š” IDFA (Identifier for Advertisers) ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • iOS 14 ๋ถ€ํ„ฐ๋Š” ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์š”์ฒญ์„ ํ†ตํ•ด ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•œ ๊ฒฝ์šฐ์—๋งŒ IDFA ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ด‘๊ณ  ์ˆ˜์ต์ด ์ค„์–ด๋“œ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด iOS 14์— ๋Œ€์‘ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ATT (AppTrackingTransparency) ์‚ฌ์šฉ

  • ํ•„์š”์‚ฌํ•ญ : XCode 12.0+
  • iOS 14 ์ด์ƒ์—์„œ IDFA ์™€ ๊ฐ™์€ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋ฐ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์š”์ฒญํ•˜๋ ค๋ฉด ATT (AppTrackingTransparency) ์•Œ๋ฆผ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์˜ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Step 1:SDK ์ค€๋น„

  • ์‹ ๊ทœ ๋ฐ ์—…๋ฐ์ดํŠธ ์•ฑ์˜ ๊ฒฝ์šฐ iOS SDK ๋ฒ„์ „ 1.8.5 ์ด์ƒ์„ ์ค€๋น„ํ•˜์‹œ๊ณ , ์œ ๋‹ˆํ‹ฐ์˜ ๊ฒฝ์šฐ Unity Package 1.9.4 ์ด์ƒ์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

- ADXLibrary (iOS)

  source 'https://github.com/adxcorp/AdxLibrary_iOS_Release.git'
  source 'https://github.com/CocoaPods/Specs.git'      

  # ๋ฐฐ๋„ˆ, ์ „๋ฉด, ๋„ค์ดํ‹ฐ๋ธŒ
  pod 'ADXLibrary', '1.8.5'
  pod 'ADXLibrary-FBAudienceNetwork', '1.8.5'
  pod 'ADXLibrary-Pangle', '1.8.5'
  pod 'ADXLibrary-Vungle', '1.8.5'

  # ๋ฆฌ์›Œ๋“œ ๋น„๋””์˜ค ์‚ฌ์šฉ ์‹œ ์ถ”๊ฐ€
  pod 'ADXLibrary-UnityAds', '1.8.5'

- ADXLibrary (Unity)

Version : 1.9.4

Step 2:Info.plist ํŒŒ์ผ ์ ์šฉ (SKAdNetwork ๊ตฌ์„ฑ)

  • ๊ด‘๊ณ  ๋„คํŠธ์›Œํฌ์— ์ง€์›๋˜๋Š” ๋ชฉ๋ก์„ SKAdNetwork ID List ์—์„œ ํ™•์ธํ•˜์—ฌ Info.plist ์— ๋„ฃ์–ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(Example)

<array>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>example100.skadnetwork</string>
    </dict>
    <dict>   
         <key>SKAdNetworkIdentifier</key>
         <string>example200.skadnetwork</string>
    </dict>
</array>

Step 3:Info.plist ํŒŒ์ผ ์ ์šฉ (๊ถŒํ•œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์„ค๋ช… ๋ฌธ๊ตฌ)

  • Info.plist ํŒŒ์ผ์— NSUserTrackingUsageDescription ํ‚ค์™€ ๊ถŒํ•œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋™์˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
ATT ์„ค๋ช… ๋ฌธ๊ตฌ ์„ค์ •

(Example - English)

<key>NSUserTrackingUsageDescription</key>
<string>This identifier will be used to deliver personalized ads to you.</string>

(Example - ํ•œ๊ธ€)

<key>NSUserTrackingUsageDescription</key>
<string>๊ฐœ์ธ ๋งž์ถค ๊ด‘๊ณ ๋ฅผ ๊ฒŒ์žฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.</string>

Step 4:์ฝ”๋“œ ์ˆ˜์ • (๊ถŒํ•œ ์š”์ฒญ)

  • ๊ด‘๊ณ  SDK ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ธฐ ์ „์— ATT ์•Œ๋ฆผ์„ ํ†ตํ•œ ๊ถŒํ•œ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ๊ถŒํ•œ ์š”์ฒญ ๊ด€๋ จ ๋ฉ”์†Œ๋“œ๋กœ requestTrackingAuthorizationWithCompletionHandler: ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์•ž์„œ ์„ค๋ช…ํ•œ Info.plist ํŒŒ์ผ์— ์„ค๋ช… ๋ฌธ๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด Crash๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ˆ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

AppDelegate.m (iOS - Objective C)

#import "AppDelegate.h"
#import <ADXLibrary/ADXLibrary.h>
#import <MoPub.h>
#import <FBAudienceNetwork/FBAudienceNetwork.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions {

    if (@available(iOS 14, *)) {
        // ATT ์•Œ๋ฆผ์„ ํ†ตํ•œ ๊ถŒํ•œ ์š”์ฒญ
        [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {

            // ๊ด‘๊ณ ์ถ”์ ์ œํ•œ ์„ค์ • (ํŽ˜์ด์Šค๋ถ ๊ด‘๊ณ )
            if (ATTrackingManager.trackingAuthorizationStatus == ATTrackingManagerAuthorizationStatusAuthorized) {
                [FBAdSettings setAdvertiserTrackingEnabled:YES];
            } else {
                [FBAdSettings setAdvertiserTrackingEnabled:NO];
            }
            
            // ๊ด‘๊ณ  SDK ์ดˆ๊ธฐํ™”
            [self initializeAdSdk];
        }];
    } else {
        // ๊ด‘๊ณ  SDK ์ดˆ๊ธฐํ™”
        [self initializeAdSdk];
    }
    
    return YES;
}

- (void) initializeAdSdk {
    MPMoPubConfiguration *sdkConfig = [[MPMoPubConfiguration alloc] initWithAdUnitIdForAppInitialization:<YOUR AD UNIT ID>];
    [[MoPub sharedInstance] initializeSdkWithConfiguration:sdkConfig
                                                completion:^{
            [ADXGDPR.sharedInstance showADXConsent:^(ADXConsentState consentState, BOOL success) {
                 //*** success๊ฐ€ ํ˜ธ์ถœ ๋œ ํ›„ ๊ด‘๊ณ  ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

                 

            }];
    }];
    
    [[GADMobileAds sharedInstance] startWithCompletionHandler:nil];
}

...

@end

AppDelegate.swift (iOS - Swift)

import UIKit
import GoogleMobileAds
import MoPub
import ADXLibrary
import AppTrackingTransparency
import FBAudienceNetwork

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions
 launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        if #available(iOS 14, *) {
            // ATT ์•Œ๋ฆผ์„ ํ†ตํ•œ ๊ถŒํ•œ ์š”์ฒญ
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                // ๊ด‘๊ณ ์ถ”์ ์ œํ•œ ์„ค์ • (ํŽ˜์ด์Šค๋ถ ๊ด‘๊ณ )
                if (ATTrackingManager.trackingAuthorizationStatus == ATTrackingManager.AuthorizationStatus.authorized) {
                    FBAdSettings.setAdvertiserTrackingEnabled(true)
                } else {
                    FBAdSettings.setAdvertiserTrackingEnabled(false)
                }
                
                // ๊ด‘๊ณ  SDK ์ดˆ๊ธฐํ™”
                self.initializeAdSdk()
              })
        } else {
            // ๊ด‘๊ณ  SDK ์ดˆ๊ธฐํ™”
            initializeAdSdk()
        }
        
        return true
    }
    
    func initializeAdSdk() {
        MoPub.sharedInstance().initializeSdk(with: MPMoPubConfiguration(adUnitIdForAppInitialization: BANNER_AD_UNIT_ID), completion:{
            ADXGDPR.sharedInstance()?.showADXConsent({ (ADXConsentState, Bool) in
                //*** success๊ฐ€ ํ˜ธ์ถœ ๋œ ํ›„ ๊ด‘๊ณ  ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
            })
        })
        
        GADMobileAds.sharedInstance().start(completionHandler:nil)
    }

}

UnityAppController.mm (Unity)

#import "UnityAppController.h"

#import <FBAudienceNetwork/FBAudienceNetwork.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>

@implementation UnityAppController

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:
(NSDictionary*)launchOptions {

    ...

    if (@available(iOS 14, *)) {
        // ATT ์•Œ๋ฆผ์„ ํ†ตํ•œ ๊ถŒํ•œ ์š”์ฒญ
        [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {

            // ๊ด‘๊ณ ์ถ”์ ์ œํ•œ ์„ค์ • (ํŽ˜์ด์Šค๋ถ ๊ด‘๊ณ )
            if (ATTrackingManager.trackingAuthorizationStatus == ATTrackingManagerAuthorizationStatusAuthorized) {
                [FBAdSettings setAdvertiserTrackingEnabled:YES];
            } else {
                [FBAdSettings setAdvertiserTrackingEnabled:NO];
            }
        }];
    }
    
    return YES;
}

...

@end

์ ์šฉํ™”๋ฉด

ATT ์•Œ๋ฆผ ์ƒ˜ํ”Œ (ํ•œ๊ธ€) ATT ์•Œ๋ฆผ ์ƒ˜ํ”Œ (English)
โš ๏ธ **GitHub.com Fallback** โš ๏ธ