解决 iOS 15的ATT授权弹窗不显示问题

6,155 阅读1分钟

背景:

刚开发完一个迭代,千辛万苦实现了产品需求和设计的交互。然而再最后审核的时候被拒了。按理说审核被拒的理由再千奇百怪,Google 一圈下来应该有答案,然而并没有。怎么办呢?

拒绝理由:

Guideline 2.1 - Information Needed

We're looking forward to completing our review, but we need more information to continue. Your app uses the AppTrackingTransparency framework, but we are unable tolocate the App Tracking Transparency permission request when reviewed on iOS 15.0.

看到这个 on iOS 15.0就知道苹果又要整什么幺蛾子了,明明 iOS14 都没问题的。

Google 中...

找着找着找到了官方文档...

官方解释:

image.png 大致意思:调用这个API requestTrackingAuthorization 必须是在 App 在前台活跃的前提下。

解决办法:

分析:

对于这种权限请求,通常情况下是写在了 AppDelegatedidFinishLaunchingWithOptions中,但明显已经不符合官方的要求了,App 还没有到 Active 的状态。

解决方式:

AppDelegate

   func applicationDidBecomeActive(_ application: UIApplication) {
       if #available(iOS 14.0, *) {
           ATTrackingManager.requestTrackingAuthorization { (status: ATTrackingManager.AuthorizationStatus) in
               // ...
           }
         }
     }
     
     

补充一点,因为的项目里面还用到了 SceneDelegate,那么iOS 13 之后 AppDelegate是不执行了的, 所以改成在 SceneDelegatesceneDidBecomeActive 方法中做权限请求。同时增加了 1 秒的延迟,避免和其他的权限弹窗冲突不显示的问题。

   func sceneDidBecomeActive(_ scene: UIScene) {
       DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
           ATTrackingManager.requestTrackingAuthorization { (status: ATTrackingManager.AuthorizationStatus) in
           // ...
          }
       }
   }
   

结语:

由于iOS 15 刚出没多久, Google 资料特别少,StackOverflow上一哥们也只发现了问题,底下没人回复,所以解决这个问题的确花费了一些时间。特地记录下自己踩过的坑。希望也能给他人避避坑。

如果有更好的解决办法,欢迎提出,共同进步!