[英]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.