React Native 플러그인 연동

1. 리액트 플러그인 설치

1.1 플러그인 다운로드

터미널에서 아래의 명령어를 통해 리액트 플러그인을 프로젝트에 다운로드 합니다.
npm install --save git+https://github.com/WisetrackerTechteam/RW-react-package.git

1.2 플러그인 설치 확인

프로젝트에 플러그인이 정상 다운로드되면 node_modules 폴더 아래 다음과 같이 플러그인 파일이 추가된 것을 확인할 수 있습니다. (폴더경로 : 프로젝트폴더 > node_modules > DotReactNativeBridge 폴더 depth 확인 )

1.3. 푸시 메시징 서비스를 이용하는 경우

터미널에서 아래의 명령어를 통해 리액트 플러그인을 프로젝트에 다운로드 합니다.
npm install --save react-native-push-notification
# 아래는 iOS를 이용하는 경우에만 추가로 실행합니다.
npm i @react-native-community/push-notification-ios --save
npx pod-install
Android와 iOS 모두 네이티브 앱 설정에 추가해야 할 작업들이 있습니다. 해당 작업은 아래 Android 설정과 iOS 설정 항목에서 "푸시 메시징 서비스"로 설명하도록 합니다. OS별로 해야 할 일을 각각 적용해주세요.

2. Android 설정

앱에 SDK 추가

android프로젝트에서 가장 상위에 있는 build.gradle에 아래와 같이 와이즈트래커의 maven repository 주소를 추가합니다.
파인더를 기준으로 봤을 때 app폴더 하위에도 build.gradle이 존재하여, 해당 build.gradle 에 작성하는 부분이 아님을 꼭 의하시기 바랍니다.
왼쪽: 폴더 기준 / 오른쪽 : 안드로이드 프로젝트 기준
폴더의 위치를 찾으셨다면, 해당 파일에서 검색을 통해 allprojects 라는 단어를 찾습니다. (혹은 파일의 가장 하위 부분에 존재하여, 스크롤 하단으로 이동) allprojects{ }를 찾았다면, repositories{ } 안에 아래 코드와 같이 와이즈트래커 repository url 을 추가합니다.
gradle
allprojects {
repositories {
google()
mavenCentral {
content {
excludeGroup 'com.facebook.react'
}
}
maven { url 'https://www.jitpack.io' }
/* sdk repository url 추가 */
maven { url 'https://wisetracker.jfrog.io/artifactory/wisetracker-gradle-release-local' }
}
}
  • 같은 build.gradle 파일에 푸시 메시징 서비스를 이용하는 경우 아래 내용을 추가해주세요. (app단의 build.gradle 파잉에도 추가되어야 할 내용이 있는데요, 해당 항목 아래에 설명을 추가하겠습니다)
build.gradle
buildscript {
...
dependencies {
...
classpath('com.google.gms:google-services:4.3.3')
...
}
}g
다음으로 "app"모듈단위에 있는 build.gradle 파일에 아래와 같이 Wisetracker SDK를 추가해주세요. 먼저 SDK를 추가할 "app"모듈의 build.gradle의 위치는 다음과 같습니다.
(폴더경로 : /프로젝트폴더/android/app/build.gradle)
왼쪽: 폴더 기준 / 오른쪽 : 안드로이드 프로젝트 기준
"app"모듈의 build.gradle 파일을 열었다면, dependencies 단어를 검색하여 해당 단어가 위치하는 곳으로 스크롤을 이동합니다. dependencies{ } 중괄호 안 하위 부분에 아래에 와이즈트래커 SDK를 추가합니다.
gradle
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
....
// SDK
implementation "com.sdk.wisetracker:base_module:latest.integration"
implementation "com.sdk.wisetracker:new_dot_module:latest.integration"
// 푸시 메시징 서비스를 이용하는 경우
implementation 'com.google.firebase:firebase-analytics:17.3.0'
}
// 푸시 메시징 서비스를 이용하는 경우
apply plugin: 'com.google.gms.google-services'
  • 상기 build.gradle 내용에 "푸시 메시징 서비스를 이용하는 경우"로 명시된 항목이 포함되어야 푸시 서비스 이용이 가능합니다.

AuthorizationKey 등록

AuthorizationKey를 등록할 수 있는 파일의 위치는 아래와 같습니다.
왼쪽: 폴더 기준 / 오른쪽 : 안드로이드 프로젝트 기준
프로젝트의 app/src/main/res/values/strings.xml 파일에 아래 코드를 추가합니다.
XML
<string-array name="dotAuthorizationKey">
<item name="useMode">1</item>
<item name="serviceNumber">xxxxx</item> <!--서비스번호 변경 필수 -->
<item name="expireDate">14</item>
<item name="isDebug">false</item>
<item name="isInstallRetention">true</item>
<item name="isFingerPrint">true</item>
<item name="accessToken"></item>
</string-array>
추가한 코드 중 serviceNumber의 value를 올바른 값으로 변경해야 합니다. 와이즈트래커 애널리틱스에 로그인하여 아래의 그림처럼 화면 상단의 Service 부분을 선택하면 앱 이름과 함께 올바른 Service Number 가 나타납니다. Service No. 옆의 숫자를 복사하여 serviceNumber의 value로 입력해주세요.
서비스 번호는 숫자로 이루어져 있습니다

HTTP 통신 허용

프로젝트의 Target API가 API Level 28 이상일 경우에 적용하는 설정입니다. 아래와 같이 HTTP 통신을 허용하는 두 가지 설정을 추가해주세요.

AndroidManifest.xml 설정

해당 파일의 경로는 다음과 같습니다. (android > app > src > main > AndroidMainfest.xml )
작성되어 있는 코드에, 아래 한 줄 짜리 networkSecurityConfig 코드를 복사하여 <application androidname = > 안에 복사하여 붙여넣기 하면 아래 최종 코드와 같은 모양이 됩니다.
android:networkSecurityConfig="@xml/network_security_config"
XML
<application androidname=".MainApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false"
android:networkSecurityConfig="@xml/network_security_config" > <!-- API Level 28 이상일 경우 해당 라인 추가 -->
푸시 메시징 서비스를 이용하는 경우, 상기 AndroidManifest.xml 파일에 추가되어야 할 것들이 있습니다. uses-permission 들과 application의 meta-data 항목 그리고, receiver 들입니다.
AndroidManifest.xml
.....
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application ....>
<!-- 푸시 메시징 서비스로 부터 메시지를 앱이 Foreground 상태에서 받았을 때 제공되는 팝업을 띄우지 않으려면 false 값을 지정해주세요. -->
<meta-data android:name="com.dieam.reactnativepushnotification.notification_foreground"
android:value="false"/>
<!-- 푸시 메시징 알림창의 배경색을 지정합니다, 원하는 색상을 마음대로 설정하실 수 있어요.. -->
<meta-data android:name="com.dieam.reactnativepushnotification.notification_color"
android:resource="@color/white"/> <!-- or @android:color/{name} to use a standard color -->
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationActions" />
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
<service
android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
...
  • 푸시 메시징 서비스 : 위의 설정에서 알림창의 배경색을 white 로 지정하는 경우, colors 항목에 추가해주세요.
android/app/src/main/res/values/colors.xml
<resources>
<color name="white">#FFF</color>
</resources>

app/res/xml/network_security_config.xml 설정

  • 이 파일이 없으면 해당 위치에 새로 만들어주세요. 만들어야 하는 위치는 다음과 같습니다.
왼쪽: 폴더 기준 / 오른쪽 : 안드로이드 프로젝트 기준
network_security_config.xml 파일을 만드셨다면 아래 스크립트를 복사하여 붙여넣기 후 저장 해 주세요.
XML
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">trk.analytics.wisetracker.co.kr</domain>
</domain-config>
</network-security-config>

초기화

Application을 상속받는 클래스가 아닌 Activity를 상속받는 기본 화면의 onCreate() 함수에 적용해 주세요. Activity를 상속받는 클래스의 위치는 다음과 같습니다. (android > app > src > main > java > com > 프로젝트명 > MainActivity 클래스)
Java
Kotlin
import com.sdk.wisetracker.new_dot.open.DOT;
public class MainActivity extends ReactActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
// SDK 호출
DOT.initialization(this);
}
}
import com.sdk.wisetracker.new_dot.open.DOT
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
// SDK 호출
DOT.initialization(this)
}
}
  • 푸시 메시징 서비스를 이용하는 경우, MainActivity 에서 "onNewIntent()" 메쏘드를 Override 하여 구현했다면 반드시 "super.onNewIntent()" 메쏘드를 호출하도록 해야 합니다. 아래 코드를 보여드릴께요.
Java
Kotlin
MainActivity
import com.sdk.wisetracker.new_dot.open.DOT;
public class MainActivity extends ReactActivity {
@Override
public void onNewIntent(Intent intent) {
...
super.onNewIntent(intent);
...
}
}
MainActivity
import com.sdk.wisetracker.new_dot.open.DOT
class MainActivity : AppCompatActivity() {
override fun onNewIntent(intent: Intent?) {
...
super.onNewIntent(intent)
...
}

Bridge파일 추가

마지막으로 bridge 함수들을 호출 할 수 있게 bridge 파일을 추가 합니다.
왼쪽은 현 페이지 상단에 기재된 플러그인 다운로드시 생긴 DotReactNativeBridge 폴더 하위에 있는 "kr"폴더의 위치이며 해당 kr 폴더를 복사한 뒤 , 오른쪽에 보이는 현 프로젝트 폴더의 /프로젝트명/android/app/src/main/java 경로에 복사한 "kr" 폴더를 붙여넣기 합니다.
왼쪽은 가장 상단에 있는 플러그인 설치시 추가 된 플러그인 파일 폴더 / 오른쪽은 프로젝트 폴더 경로
파일 추가 후 /android/app/src/main/java/com/sampleapp/ 경로에 있는 MainApplication.java 파일에서 packages.add(new BridgePackage()); 를 추가 해 줍니다.
import kr.co.wisetracker.BridgePackage;
@Override
protected List<ReactPackage> getPackages() {
...
...
...
packages.add(new BridgePackage()); // kr.co.wisetracker.BridgePackage 추가 해 주세요
return packages;
}

이벤트 설정

초기화와 bridge 폴더 복사 이후에 화면전환 또는 이벤트 분석을 위한 적용 방법은 sample소스를 다운받으신 후 확인이 가능합니다.

[추가] 고급 설정

고급 설정의 경우, 해당 링크를 참고해 주시기 바랍니다.

설정 확인

모든 설정 완료 후 log를 통해 데이터 수집을 확인 합니다.
[WiseLog]: RetrofitLogInterceptor#intercept(33)#DEBUG_MESSAGE#SERVER RESPONSE ->
{"msg":"Data Receive Success","code":"RES001","visitNewServerTime":1657275610434,
"attributedInfo":{"linkId":{},"install":{},"pushMessage":{},"assist":[],
"iosAd":{},"open":{},"abusing":{}}}
log에 해당 내용이 확인이 된다면 수신이 정상적으로 이루어졌으며, 와이즈트래커의 SDK를 호출할 준비가 완료되었습니다.

3. iOS 설정

SDK 설치

Cocoapod 환경에서 SDK 다운로드 방법

XCode 프로젝트 중 Podfile 파일에 다음과 같이 SDK를 추가합니다
pod 'RW'
기존에 SDK를 한번 설치한 경우에는 설치할SDK 버전을 표시해야 하는 경우도 있습니다. 아래와 같이 설치할 SDK버전을 명시적으로 표시하면 됩니다.
pod 'RW', '~> 1.1.25'
Podfile 에 해당라인을 추가한 후 Terminal 프로그램을 실행하여 다음의 명령을 수행합니다
pod install
SDK 버전 업데이트의 경우 다음의 명령을 수행합니다.
pod update
정상적으로 설치가 되면 아래와 같은 폴더 구조를 확인할 수 있습니다.
  • 푸시 메시징 서비스를 이용하는 경우, App의 Capabilities에 아래 두 가지 Capabilities를 추가해야 합니다.
    • Push Notification Capabilities
    • Background Modes > Remote notification Capabilities

SDK 설치 - Cocoapod 사용하지 않을 경우

SDK 파일을 URL에서 다운로드 합니다.
다운된 파일을 압축 해제하면 다음과 같은 파일이 확인 가능하고 이중 아래에 선택된 3개의 파일을 분석 대상 앱 프로젝트에 추가합니다.
프로젝트 선택후 마우스 우클릭, Add Files to 메뉴를 선택합니다.
앞에서 다운로드 받고, 압축 해제한 폴더에 들어가서 아래와 같이 추가 대상 파일을 선택하고, 화면 아래쪽 설정은 존재하는 모든 target에 포함되었는지 확인후 추가 하면 됩니다.
BuildSetting 에 아래와 같이 설정을 추가합니다.
xcode 가 12.3 이후 버전이고 빌드 과정에서 아래와 유사한 오류가 발생하는 경우가 있으며,
위의 경우에는 아래와 같이 설정을 하고, 빌드를 하면됩니다.

dotAuthorizationKey 등록

xcode프로젝트에서 info.plist 파일을 찾습니다. info.plist의 위치는 다음과 같습니다.
info.plist 파일을 Open As Source Code 방식으로 오픈한 후, 아래 코드를 복사하여 info.plist의 가장 하단에 다음과 같은 위치에 붙여넣기 합니다.
XML
<key>dotAuthorizationKey</key>
<dict>
<key>serviceNumber</key>
<string>xxxxx</string>
<key>expireDate</key>
<string>14</string>
<key>isDebug</key>
<string>true</string>
<key>isInstallRetention</key>
<string>true</string>
<key>isFingerPrint</key>
<string>true</string>
<key>accessToken</key>
<string></string>
<key>useMode</key>
<string>2</string>
</dict>
추가한 코드 중 "xxxxx"로 표시되어 있는 부분은 value를 올바른 값으로 변경해야 합니다. serviceNumber 확인은 와이즈트래커 애널리틱스에 로그인하시어 화면 상단의 Service 부분을 선택하면 앱 이름과 함께 올바른 Service Number 가 나타납니다. Service No. 옆의 숫자를 복사하여 serviceNumber의 value로 입력해주세요.
와이즈트래커 애널리틱스 serviceNumber 확인 방법
추가

HTTP 통신 허용

http통신을 허용하기 위해 NSAppTransportSecurity 를 아래와 같이 추가해야합니다.
이전과 마찬가지로 info.plist 파일을 Open As Source Code 방식으로 오픈한 후, NSAppTransportSecurity 를 검색합니다.
<!-- HTTP 통신 허용 -->
<key>NSAllowsArbitraryLoads</key>
<true/>
위의 코드를 복사하여 NSExceptionDomains 위에 코드를 붙여넣기 합니다. 아래의 샘플 코드를 확인하여, 정확한 위치에 코드 추가가 이루어졌는지 확인합니다.
<key>NSAppTransportSecurity</key>
<dict>
<!-- HTTP 통신 허용 -->
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>

초기화

  • 초기화 방법은 SceneDelegate설정된 경우설정되지 않은 경우에 따라 달라집니다.
  • SceneDelegate를 사용하지 않으면 AppDelegate에서 초기화작업을 하고, 그렇지 않고 SceneDelegate를 사용하면 SceneDelegate에서 이 작업을 해야 합니다.

1. iOS13 미만 (SceneDelegate 없음)

AppDelegate 폴더의 위치는 다음과 같습니다.
AppDelegate 파일을 열어 didFinishLaunchingWithOptions 를 검색하여, didFinishLaunchingWithOptions 함수에 SDK를 Intialization하기 위한 코드를 다음과 같이 적용합니다. SDK가 정상적으로 초기화 되었을 때 아래와 같은 기본 분석이 가능합니다.
  • 앱 실행 및 방문수, 일/주/월순수방문수 등 방문과 관련된 지표
  • 통신사, 단말기, 국가 등 방문자의 단말기 환경으로 부터 추출될 수 있는 지표
Objective-C
#import <DOT/DOT.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
RCTAppSetupPrepareApp(application);
// S: Wisetracker SDK init
[DOT initialization:launchOptions application:application];
#ifdef DEBUG
[DOT checkDebugMode:true];
#else
[DOT checkDebugMode:false];
#endif
// E: Wisetracker SDK init
return YES;
}
위의 코드를 추가한 후 아래의 샘플코드를 통해 맞는 위치에 코드 적용이 이루어 졌는지 확인 합니다.
wisetracker SDK init sample 코드
DOT가 사용되는 곳에서는 파일 최상단에 #import <DOT/DOT.h>을 통해 import가 필요합니다. 이하 적용 예시에서는 import하는 부분이 생략되어 있습니다.
  • 푸시 메시징 서비스를 이용하는 경우, AppDelegate 헤더파일에 아래의 코드가 추가되어야 합니다.
Objective-C
AppDelegate.h
// 푸시 메시징 서비스를 이용하기 위해 푸시 서비스를 등록하는 코드를 import 합니다.
#import <UserNotifications/UNUserNotificationCenter.h>
...
// "UNUserNotificationCenterDelegate" 프로토콜을 추가합니다.
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate, UNUserNotificationCenterDelegate>
...
  • 푸시 메시징 서비스를 이용하기 위해 AppDelegate.m 구현파일을 수정합니다. 아래 코드블럭 전체가 해당됩니다.
Objective-C
AppDelegate.m
#import <UserNotifications/UserNotifications.h>
#import <RNCPushNotificationIOS.h>
...
// Required for the register event.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
[RNCPushNotificationIOS didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
// Required for the notification event. You must call the completion handler after handling the remote notification.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[RNCPushNotificationIOS didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
// Required for the registrationError event.
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
[RNCPushNotificationIOS didFailToRegisterForRemoteNotificationsWithError:error];
}
// Required for localNotification event
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)(void))completionHandler
{
[RNCPushNotificationIOS didReceiveNotificationResponse:response];
}
  • 푸시 메시징 서비스를 이용하기 위해 AppDelete.m 파일의 다른 부분들에도 수정치 추가되어야 합니다.
Objective-C
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
// UNUserNotificationCenter 설정
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
return YES;
}
// Foreground 상태에서 푸시가 도달했을 때 처리하기 위한 부분
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge);
}

2. iOS13 이상 (SceneDelegate 사용)

👉 iOS13 이상이어도 SceneDelegate를 사용하지 않을 수도 있어요, 이 때에는 위의 SceneDelegate를 사용하지 않는 경우를 참조하세요.

SceneDelegatesceneDidBecomeActive함수에 SDK를 Initialization하기 위한 코드를 다음과 같이 적용합니다. SDK가 정상적으로 초기화 되었을 때 아래와 같은 기본 분석이 가능합니다.
  • 앱 실행 및 방문수, 일/주/월순수방문수 등 방문과 관련된 지표
  • 통신사, 단말기, 국가 등 방문자의 단말기 환경으로 부터 추출될 수 있는 지표
Objective-C
#import <DOT/DOT.h>
@implementation SceneDelegate
...
- (void)sceneDidBecomeActive:(UIScene *)scene {
// S: Wisetracker SDK init
[DOT initialization:nil application:[UIApplication sharedApplication]];
#ifdef DEBUG
[DOT checkDebugMode:true];
#else
[DOT checkDebugMode:false];
#endif
// E: Wisetracker SDK init
}
...
@end

Bridge 파일 추가

마지막으로 bridge 함수들을 호출 할 수 있게 bridge 파일을 추가 합니다.
왼쪽은 처음 플러그인 다운로드시 생긴 node_modules/DotReactNativeBridge/ios 폴더 하위에 있는 bridge파일의 위치이며 파일을 복사한 뒤 , 오른쪽에 보이는 현 프로젝트 폴더의 /프로젝트명/ios/프로젝트명과 동일한 폴더 경로에 복사한 두 개의 bridge 파일을 붙여넣습니다.
왼쪽은 플러그인 설치시 추가 된 플러그인 파일 폴더 / 오른쪽은 프로젝트 폴더 경로

이벤트 설정

초기화와 bridge 폴더 복사 이후에 화면전환 또는 이벤트 분석을 위한 적용 방법은 sample소스를 다운받으신 후 확인이 가능합니다.

[추가] 고급 설정

고급 설정의 경우, 해당 링크를 참고해 주시기 바랍니다.

설정 확인

모든 설정 완료 후 xcode의 console을 통해 log확인을 합니다. console 검색 시 아래 "RES001" 코드가 확인이 되신다면, 수신이 정상적으로 이루어졌으며, 와이즈트래커의 SDK를 호출할 준비가 완료되었습니다.
code = RES001;
msg = "Data Receive Success";

[추가] iOS 14 개인정보방침 변경 관련 가이드

  • iOS 14부터 IDFA를 획득하기 위해서는 사용자의 동의를 얻어야 합니다.

info.plist파일에 NSUserTrackingUsageDescription 설정 추가

<key>NSUserTrackingUsageDescription</key>
<string>Your data will be used to deliver personalized ads to you.</string>

App Tracking Transparency 동의 System Alert 노출 & API 호출

  • IDFA 획득을 위해 앱 추적 투명성 동의 요청 System Alert(대화 상자)을 띄워야 합니다. 동의 요청 System Alert(대화 상자) 화면에 띄우려면 requestTrackingAuthorizationWithCompletionHandler:를 호출합니다. completionHandler에서 동의 시 SDK API를 호출하도록 위와 같이 구현하시면 됩니다.
Swift
Objective-C
import AppTrackingTransparency
import AdSupport
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization { (AuthorizationStatus) in
if(AuthorizationStatus == .authorized) {
DOT.setIDFA(ASIdentifierManager.shared().advertisingIdentifier.uuidString)
}
}
} else {
DOT.setATTAuthorizationStatus(3)
}
#import <AppTrackingTransparency/ATTrackingManager.h>
#import <AdSupport/AdSupport.h>
if (@available(iOS 14, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
if(status == ATTrackingManagerAuthorizationStatusAuthorized) {
[DOT setIDFA:[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]];
}
}];
} else {
[DOT setATTAuthorizationStatus:3];
}