iOS 15:当应用程序在 SwiftUI 中启动时如何显示 ATT 对话框

don*_*han 14 ios swift swiftui apptrackingtransparency ios15

在 iOS 14 中,当应用程序在 SwiftUI 中启动时,它可以显示 ATT(应用程序跟踪透明度)对话框,如下所示。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    if #available(iOS 14, *) {
        ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
            // loadAd()
        })
    } else {
        // loadAd()
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

但是,在 iOS 15.0 中,它不起作用。苹果文档描述如下。

仅当应用程序状态为:UIApplicationStateActive 时才会提示调用 API。通过应用扩展调用 API 不会提示。 https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/3547037-requesttrackingauthorization

如何在 iOS 15 中应用程序启动时显示 ATT 对话框?

2021/9/28更新 我解决如下。

struct HomeView: View {
    var body: some View {
        VStack {
            Text("Hello!")
        }.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sid*_*ide 14

而不是在didFinishLaunchingWithOptions调用applicationDidBecomeActive中调用应用程序跟踪透明度权限,它将解决您的问题

应用程序委托中

func applicationDidBecomeActive(_ application: UIApplication) {
    requestDataPermission()
}

func requestDataPermission() {
    if #available(iOS 14, *) {
        ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
            switch status {
            case .authorized:
                // Tracking authorization dialog was shown
                // and we are authorized
                print("Authorized")
            case .denied:
                // Tracking authorization dialog was
                // shown and permission is denied
                print("Denied")
            case .notDetermined:
                // Tracking authorization dialog has not been shown
                print("Not Determined")
            case .restricted:
                print("Restricted")
            @unknown default:
                print("Unknown")
            }
        })
    } else {
        //you got permission to track, iOS 14 is not yet installed
    }
}
Run Code Online (Sandbox Code Playgroud)

在信息.plist

<key>NSUserTrackingUsageDescription</key>
<string>Reason_for_data_tracking</string>
Run Code Online (Sandbox Code Playgroud)

  • 或者如果您在“UISceneDelegate”子类中使用场景“sceneDidBecomeActive”,因为 UIKit 正在调用该方法而不是应用程序委托中的方法,并且还添加 1 秒的延迟,否则它只返回“notDetermined”不显示对话框的状态 (2认同)

She*_*ood 8

正如 @donchan 已经提到的,使用以下代码:

struct HomeView: View {
    var body: some View {
        VStack {
            Text("Hello!")
        }.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 -1

如果您正在编写 SwiftUI 应用程序,则可以在开始屏幕上触发它。

struct HomeView: View {
    
    var body: some View {
        VStack {
            Text("Hello!")
        }.onAppear {
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记将必要的添加内容添加到 .plist 中。

<key>NSUserTrackingUsageDescription</key>
<string>...</string>
Run Code Online (Sandbox Code Playgroud)

因此,它将在模拟器或真实设备上运行。