ATrackingManager.AuthorizationStatus 始终返回 notDetermined

Val*_*ina 11 ios swift xcuitest

我不知道我是否可以在 iOS 上的 UI 测试中使用此功能,但我尝试了一下,但遇到了问题。

在我的 UI 测试中,我可以选择允许跟踪我的应用程序,也可以拒绝跟踪,但在执行所有这些操作之后,我希望通过 结帐状态 IDFA ATTrackingManager.AuthorizationStatus,但此方法始终返回notDetermined。如果我转到“设置”>“隐私”>“跟踪”,我会看到设置已正确应用(“允许应用请求跟踪”开关已打开,并且我的应用程序处于正确状态(打开或关闭))。我不知道为什么我收到错误的 AuthorizationStatus。这是我的 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

在我的 UI 测试中设置 IDFA 状态后,我调用此方法,例如。advertisingTrackingStatusCheckout(status: TrackingStatus.denied) 但它总会回归notDetermined

它的行为只有一个例外:如果我手动将开关“允许应用程序请求跟踪”设置为关闭状态,则调用 willATTrackingManager.trackingAuthorizationStatus返回denied

Man*_*ngh 13

删除应用程序,并延迟调用 sceneDidBecomeActive 中的函数。因此,一旦您的应用程序激活,它就会显示。我面临着同样的问题,现在已经解决了。像这样

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
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述