【问题标题】:App Tracking Transparency Dialog does not appear on iOS应用程序跟踪透明度对话框不会出现在 iOS 上
【发布时间】:2021-11-23 20:48:37
【问题描述】:

Apple 审阅者刚刚拒绝了我的应用,因为 ATT 请求未出现:“在 iOS 15.0.1 上审阅时,我们无法找到 App Tracking Transparency 权限请求。”

我的代码如下图:

if #available(iOS 14, *) {
  ATTrackingManager.requestTrackingAuthorization { (status) in
    //print("IDFA STATUS: \(status.rawValue)")
    FBAdSettings.setAdvertiserTrackingEnabled(true)
  }
}

我在 AppDelegate didFinishLaunchingWithOptionsviewDidLoad 中都实现了这段代码。 ATT 权限请求出现在 iOS 14 上,但不在 iOS 15 上。

【问题讨论】:

标签: swift ios15 apptrackingtransparency


【解决方案1】:

我已更改为从

调用请求
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
}

@available(iOS 13.0, *)
func sceneDidBecomeActive(_ scene: UIScene) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        self.requestPermission()
    }
}

func requestPermission() {
    if #available(iOS 15.0, *) {
            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:
                   
                }
            })
        }
    }
}

【讨论】:

    【解决方案2】:

    我已更改为从 AppDelegate 的 applicationDidBecomeActive 方法调用请求,并且成功了!

    在 iOS15 上首次应用启动时会显示弹出窗口。

    【讨论】:

      【解决方案3】:

      该死的,我修好了:(这都是关于 iOS 警报系统的。在询问通知请求后,我正在请求 App Tracking Transparency。通知请求警报关闭后,ATT 警报需要出现。它正在工作在 iOS 14 上很好,但在 iOS 15 上要在另一个警报之后立即显示警报,彼此之间需要有一个延迟时间。

      编辑: 这是我的代码,分别显示两个警报:

       func setNotification(){
          //Ask for notification permission
          let n = NotificationHandler()
          n.askNotificationPermission {
              //n.scheduleAllNotifications()
              
              //IMPORTANT: wait for 1 second to display another alert
              DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                  if #available(iOS 14, *) {
                    ATTrackingManager.requestTrackingAuthorization { (status) in
                      //print("IDFA STATUS: \(status.rawValue)")
                      //FBAdSettings.setAdvertiserTrackingEnabled(true)
                    }
                  }
              }
          }
      }
      

      为了您的方便,这里是我的 NotificaitionHandler 类:

      import UserNotifications
      
      class NotificationHandler{
      //Permission function
      func askNotificationPermission(completion: @escaping ()->Void){
          
          //Permission to send notifications
          let center = UNUserNotificationCenter.current()
          // Request permission to display alerts and play sounds.
          center.requestAuthorization(options: [.alert, .badge, .sound])
          { (granted, error) in
              // Enable or disable features based on authorization.
              completion()
          }
      }
      

      【讨论】:

      • 如果你能提供更多关于你是如何实现它的细节的。也许分享一些代码
      • 我已经编辑了我的答案@TonuiNicholus
      • 我试过了,我用我自己的项目在应用商店发布了这个答案。但是,我很惊讶它被苹果拒绝了。
      • 如果需要 1.5 秒?你应该检查的是UIApplication.shared.applicationState,当你调用它时它可能是inactive。更好的解决方案是在AppDelegateapplicationDidBecomeActive 中调用它,或者为UIApplication.didBecomeActiveNotification 添加通知并在那里请求身份验证
      • 是的,我的情况完全一样。 2 权限请求。通知和跟踪。
      【解决方案4】:

      Apple person 建议您通过AppDelegate 中的applicationDidBecomeActive(_:) 请求它。这就是我解决 iOS 问题的方法。

      import UIKit
      import AppTrackingTransparency
      
      class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {
          func applicationDidBecomeActive(_ application: UIApplication) {
              if #available(iOS 15.0, *) {
                  ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                      
                  })
              }
          }
      }
      

      【讨论】:

      • 这对我不起作用!
      • 我们从applicationDidFinishLaunching 调用requestTrackingAuthorization,在iOS 15 应用程序上调用inactive。将其移至 applicationDidBecomeActive 解决了我们的问题。
      • 为我工作,谢谢
      • 您可以通过为 didBecomeActive 创建通知从任何地方调用它:NotificationCenter.default.addObserver(self, selector: #selector(showTrackingAction), name: UIApplication.didBecomeActiveNotification, object: nil)
      • 这是正确的答案,我也可以验证苹果也推荐这个。
      猜你喜欢
      • 2021-11-20
      • 2021-06-17
      • 2022-12-11
      • 2021-07-25
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 2022-06-26
      相关资源
      最近更新 更多