Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 523
Valentina Avatar asked May 26 '21 11:05

Valentina


People also ask

Should you allow tracking on iPhone?

Experts encourage iPhone users not to allow tracking to protect their data. iPhone users likely will experience less personalized ads, but advertising isn't going to go away altogether.

How do I change tracking settings on my iPhone?

Go to Settings > Privacy & Security > Tracking. The list shows the apps that requested permission to track you. You can turn permission on or off for any app on the list. To stop all apps from asking permission to track you, turn off Allow Apps to Request to Track (at the top of the screen).

How do I ask apps not to track me?

Indeed, if you would like your answer to be no by default, users can toggle off the “allow apps to request to track” button in the tracking tab under iPhone's privacy settings and all new app tracking requests will be automatically denied.

What does allow tracking mean on iPhone?

App Tracking Transparency allows you to choose whether an app can track your activity across other companies' apps and websites for the purposes of advertising or sharing with data brokers.


1 Answers

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

like image 79
Mandeep Singh Avatar answered Oct 29 '22 22:10

Mandeep Singh