Valentina
Valentina

Reputation: 634

ATTrackingManager.AuthorizationStatus always returns notDetermined

I don't know can I use this functionality in my UI tests on iOS, but I try it, an have problem with this.

In my UI tests I can choose Allow tracking for my app or I can decline tracking, but after all these actions, I want checkout status IDFA via ATTrackingManager.AuthorizationStatus, but this method always returns notDetermined. If I go to Settings > Privacy > Tracking, here I see that settings applied correctly (switch Allow App To Request To Track is on and switch for my app in right state (on or off)). I don't have any idea why I recieve wrong AuthorizationStatus. Here is my code in my XCTestCase:

import AppTrackingTransparency
enum TrackingStatus {

        case authorized
        case denied
        case notDetermined
    }
    
    func map(_ status: ATTrackingManager.AuthorizationStatus) -> TrackingStatus {
        switch ATTrackingManager.trackingAuthorizationStatus {
        case .notDetermined:
            return .notDetermined
        case .authorized:
            return .authorized
        default:
            return .denied
        }
    }
    
    func advertisingTrackingStatusCheckout(status: TrackingStatus) {
        
        print("IDFA status: \(ATTrackingManager.trackingAuthorizationStatus)")
        
        var currentTrackingStatus: TrackingStatus {
            return map(ATTrackingManager.trackingAuthorizationStatus)
        }
        
        guard currentTrackingStatus == status else {
            XCTFail("IDFA status: \(currentTrackingStatus), expected: \(status)")
            return
        }
    }

After settings IDFA status in my UI test, i call this method, ex. advertisingTrackingStatusCheckout(status: TrackingStatus.denied) But it always returns notDetermined.

It behaviors have only one exception: If I manually set switch Allow App To Request To Track to off-state, calling the ATTrackingManager.trackingAuthorizationStatus will returns denied.

Upvotes: 12

Views: 5868

Answers (1)

Mandeep Singh
Mandeep Singh

Reputation: 2855

Delete the App, And call your function in sceneDidBecomeActive with delay. So once your app become active then it will shown. Am facing the same issue now its resolved. Like this

func sceneDidBecomeActive(_ scene: UIScene) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        self.requestPermission()
    }
}

func requestPermission() {
    if #available(iOS 14, *) {
        ATTrackingManager.requestTrackingAuthorization { status in
            switch status {
            case .authorized:
                // Tracking authorization dialog was shown
                // and we are authorized
                print("Authorized Tracking Permission")
                
                // Now that we are authorized we can get the IDFA
            case .denied:
                // Tracking authorization dialog was
                // shown and permission is denied
                print("Denied Tracking Permission")
            case .notDetermined:
                // Tracking authorization dialog has not been shown
                print("Not Determined Tracking Permission")
            case .restricted:
                print("Restricted Tracking Permission")
            @unknown default:
                print("Unknown Tracking Permission")
            }
        }
    } else {
        // Fallback on earlier versions
    }
}

enter image description here

Upvotes: 15

Related Questions