1919#import < sys/utsname.h>
2020#endif
2121
22+ #if !TARGET_OS_TV
23+ #if __has_feature(modules)
24+ @import AdServices;
25+ #else
26+ #import < AdServices/AdServices.h>
27+ #endif
28+ #endif
29+
2230@implementation BNCSystemObserver
2331
2432+ (NSString *)getUniqueHardwareId : (BOOL *)isReal
@@ -46,10 +54,20 @@ + (NSString *)getUniqueHardwareId:(BOOL *)isReal
4654 return uid;
4755}
4856
49- + (NSString *) getAdId {
50-
51- // This macro is unnecessary since this code only runs if AdSupport.framework is included
52- // However, some clients feel more comfortable with no IDFA code at all.
57+ + (NSString *)appleAttributionToken {
58+ #if !TARGET_OS_TV
59+ if (@available (iOS 14.3 , *)) {
60+ NSError *error;
61+ NSString *appleAttributionToken = [AAAttribution attributionTokenWithError: &error];
62+ if (!error) {
63+ return appleAttributionToken;
64+ }
65+ }
66+ #endif
67+ return nil ;
68+ }
69+
70+ + (NSString *)getAdId {
5371 #ifdef BRANCH_EXCLUDE_IDFA_CODE
5472 return nil ;
5573
@@ -75,10 +93,43 @@ + (NSString*) getAdId {
7593 #endif
7694}
7795
78- + (BOOL )adTrackingSafe {
96+ // Returns AppTrackingTransparency status. It does not trigger the prompt.
97+ + (NSString *)attOptedInStatus {
98+ NSString *statusString = @" unavailable" ;
99+
100+ #ifdef BRANCH_EXCLUDE_ATT_STATUS_CODE
101+ #else
102+
103+ Class ATTrackingManagerClass = NSClassFromString (@" ATTrackingManager" );
104+ if (ATTrackingManagerClass) {
105+ SEL trackingAuthorizationStatusSelector = NSSelectorFromString (@" trackingAuthorizationStatus" );
106+ unsigned long status = ((unsigned long (*)(id , SEL ))[ATTrackingManagerClass methodForSelector: trackingAuthorizationStatusSelector])(ATTrackingManagerClass, trackingAuthorizationStatusSelector);
107+
108+ // map ATT status to string values
109+ switch (status) {
110+ case 0 :
111+ statusString = @" not_determined" ;
112+ break ;
113+ case 1 :
114+ statusString = @" restricted" ;
115+ break ;
116+ case 2 :
117+ statusString = @" denied" ;
118+ break ;
119+ case 3 :
120+ statusString = @" authorized" ;
121+ break ;
122+ default :
123+ break ;
124+ }
125+ }
79126
80- // This macro is unnecessary since this code only runs if AdSupport.framework is included
81- // However, some clients feel more comfortable with no IDFA code at all.
127+ #endif
128+ return statusString;
129+ }
130+
131+ // on iOS 14+ this value is always NO
132+ + (BOOL )adTrackingSafe {
82133 #ifdef BRANCH_EXCLUDE_IDFA_CODE
83134 return NO ;
84135
0 commit comments