簡體   English   中英

iOS 15:如何在 SwiftUI 中啟動應用程序時顯示 ATT 對話框

[英]iOS 15: How to display ATT dialog when the app starts in SwiftUI

在 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
}

但是,在 iOS 15.0 中,它不起作用。 Apple 文檔描述如下。

調用 API 僅在應用程序狀態為:UIApplicationStateActive 時提示。 通過應用擴展調用 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 })
        }
    }
}

而不是在applicationDidBecomeActive中的didFinishLaunchingWithOptions調用中調用應用程序跟蹤透明度權限,它將解決您的問題

AppDelegate 中

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
    }
}

info.plist

<key>NSUserTrackingUsageDescription</key>
<string>Reason for data tracking</string>

正如@donchan 已經提到的,使用以下代碼:

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

如果您正在編寫 SwiftUI 應用程序,則可以在開始屏幕上觸發它。

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

不要忘記向 .plist 添加必要的添加項。

<key>NSUserTrackingUsageDescription</key>
<string>...</string>

因此,它將在模擬器或真實設備上運行。

對上述所有答案的一個非常重要的補充:必須調用一次 ATT 對話! 例如,如果在廣告管理器內部,您在請求廣告之前重復調用 ATT 對話框(就像以前的操作系統版本一樣),則該對話框將不會顯示! 因此,必須將 ATT 對話請求直接插入到視圖中,並延遲至少 1 秒才能無條件觸發。

對於 iOS 15,我遇到了同樣的問題,我通過將代碼執行延遲一秒鍾來修復它們。

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        if #available(iOS 14, *) {
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                DispatchQueue.main.async {
                    self.bannerView.load(GADRequest())
                    self.interstitial.load(request)
                }
            })
        } else {
            // Fallback on earlier versions
            self.bannerView.load(GADRequest())
            self.interstitial.load(request)
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM