         }
     }
 
+    @available(iOS 14.0.0, tvOS 14.0.0, *)
+    private var fetchAuthorizationStatus: FakeTrackingManagerAuthorizationStatus {
+        let needsTrackingAuthorization = self.needsTrackingAuthorization
+
+        guard let trackingManagerProxy = self.trackingProxy else {
+            if needsTrackingAuthorization {
+                return .denied
+            } else {
+                return .notDetermined
+            }
+        }
+
+        let authStatusSelector = NSSelectorFromString(trackingManagerProxy.authorizationStatusPropertyName)
+        guard trackingManagerProxy.responds(to: authStatusSelector) else {
+            Logger.warn(Strings.attribution.att_framework_present_but_couldnt_call_tracking_authorization_status)
+            return .denied
+        }
+
+        let authStatus = callAuthStatusSelector(authStatusSelector, trackingManagerProxy: trackingManagerProxy)
+        return authStatus
+    }
+
+    private var trackingProxy: TrackingManagerProxy? {
+        let trackingManagerProxy = attributionFactory.atFollowingProxy()
+        if trackingManagerProxy == nil && needsTrackingAuthorization {
+            Logger.warn(Strings.attribution.search_ads_attribution_cancelled_missing_att_framework)
+        }
+        return trackingManagerProxy
+    }
+
+    private var needsTrackingAuthorization: Bool {
+        let minimumOSVersionRequiringAuthorization = OperatingSystemVersion(majorVersion: 14,
+                                                                            minorVersion: 5,
+                                                                            patchVersion: 0)
+        return systemInfo.isOperatingSystemAtLeastVersion(minimumOSVersionRequiringAuthorization)
+    }
+
+    private func callAuthStatusSelector(
+        _ authStatusSelector: Selector,
+        trackingManagerProxy: TrackingManagerProxy
+    ) -> FakeTrackingManagerAuthorizationStatus {
+        // we use unsafeBitCast to prevent direct references to tracking frameworks, which cause issues for
+        // kids apps when going through app review, even if they don't actually use them at all.
+        typealias ClosureType = @convention(c) (AnyObject, Selector) -> FakeTrackingManagerAuthorizationStatus
+        let authStatusMethodImplementation = trackingManagerProxy.method(for: authStatusSelector)
+        let authStatusMethod: ClosureType = unsafeBitCast(authStatusMethodImplementation, to: ClosureType.self)
+        let authStatus = authStatusMethod(trackingManagerProxy, authStatusSelector)
+        return authStatus
+    }
+
 }

        return true
    }

}

private extension AttributionFetcher {

    @available(iOS 14.0.0, tvOS 14.0.0, *)
    private var isAuthorizedToPostSearchAdsInATTRequiredOS: Bool {
        let minimumOSVersionRequiringAuthorization = OperatingSystemVersion(majorVersion: 14,
                                                                            minorVersion: 5,
                                                                            patchVersion: 0)
        let needsTrackingAuthorization = systemInfo
            .isOperatingSystemAtLeastVersion(minimumOSVersionRequiringAuthorization)

        guard let trackingManagerProxy = attributionFactory.atFollowingProxy() else {
            if needsTrackingAuthorization {
                Logger.warn(Strings.attribution.search_ads_attribution_cancelled_missing_att_framework)
            }
            return !needsTrackingAuthorization
        }


            return false
        }

        let authStatus = callAuthStatusSelector(authStatusSelector, trackingManagerProxy: trackingManagerProxy)

        switch authStatus {
        case .restricted, .denied:
